Compare commits

...

158 Commits

Author SHA1 Message Date
AlexandreSi
2f7e0ad438 Attempt to remove modal window frame to hide close button on linux 2022-08-31 11:03:55 +02:00
Florian Rival
2abf636283 Fix tests on Windows
Don't show in changelog
2022-08-30 18:15:08 +02:00
D8H
7d09853c12 Fix tile maps layer filtering (#4249) 2022-08-30 14:31:28 +02:00
AlexandreS
bb88f3ae4d Add button to release notes in about dialog
Do not show in changelog
2022-08-30 13:52:10 +02:00
D8H
44b06039e1 Upgrade the Pixi tile map extension to 3.2.2 (#4212)
* It also lifts the 16,000 tiles limit.
2022-08-30 13:11:59 +02:00
Clément Pasteau
9c7f2e4293 Remove user public profile search type (#4243)
Do not show in changelog
2022-08-30 11:26:12 +02:00
AlexandreS
facbbe614d Add button in changelog dialog to read on Github to benefit from browser translator 2022-08-30 11:09:15 +02:00
AlexandreS
d5cadadf82 Fix browser translator crashing the app 2022-08-29 11:30:52 +02:00
D8H
aed4b76a3f Refactor behavior configuration model (#4217)
* Merge BehaviorContent into Behavior and add CustomBehavior
* Don't show in changelogs
2022-08-29 09:21:21 +02:00
Florian Rival
b1e03f4555 Add support for uploading your own files from your device for cloud project on the web-app (#4225)
* You can now upload your own files when working on the web-app, when your project is saved as a Cloud project.
* This means the web-app can be used without limits to build any game you could build on the desktop app.
* Support for Cloud projects on the desktop app will be available soon. You will also be able to save an existing project on your computer as a cloud project, or vice versa.
2022-08-28 22:30:58 +02:00
D8H
93be3153b5 Fix useless "Change" prefix in some actions name (#4238) 2022-08-28 21:44:23 +02:00
Aurélien Vivet
d0c9ff6754 Fix the action to tween the number of a scene variable (#4235) 2022-08-28 16:53:16 +02:00
AlexandreS
a5cf0896bc Fix the wording of the layer field when the layer is not optional (though it has a default value: the base layer) (#4232) 2022-08-26 17:12:40 +02:00
Clément Pasteau
7f6ce26c43 Handle players logging in to GDevelop and becoming creators (#4231)
Do not show in changelog
2022-08-26 13:51:45 +02:00
AlexandreS
eda9db6b40 Fix points coordinates inputs not losing focus when moving points on the preview 2022-08-26 09:55:37 +02:00
github-actions[bot]
b9405f5e7d Update translations [skip ci] (#4220)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-08-26 09:26:08 +02:00
Clément Pasteau
ca591f60d6 Improve game templates visibility
* Change "Create a new project" action from the command palette to directly open a blank project
* Add 2 new actions in the Desktop menu "Create an empty project" and "Create a project from a template"
* Templates are now displayed at the top of the Build section
* The button "Create a project" in the Build section now directly opens a blank project
2022-08-25 16:49:37 +02:00
Peter Anderson
214e012ec4 Rename object variables expression names to differentiate number and text variables. 2022-08-25 15:32:39 +02:00
Aurélien Vivet
9cc0172a60 Add Educational tag for games on Liluo.io (#4222) 2022-08-25 10:20:34 +02:00
Florian Rival
6e01228ae6 Fix Safari/iOS unable to load some images in the app (#4148) 2022-08-24 12:25:33 +02:00
github-actions[bot]
e22611625e Update translations [skip ci] (#4205)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-08-22 14:58:20 +02:00
Clément Pasteau
28ccb55a06 Improve onboarding banner (#4216)
Do not show in changelog
2022-08-22 14:41:07 +02:00
D8H
7893b892a3 Add an events-based object editor prototype (#4208)
* don't show in change logs
2022-08-22 14:05:58 +02:00
Arthur Pacaud
10b3c50a42 Fix parameter to specify the P2P port not being an expression (#4215) 2022-08-22 12:00:09 +02:00
D8H
8c5fbc6e34 Add missing translations for some messages shown when renaming an object (#4213) 2022-08-21 19:00:10 +02:00
Aurélien Vivet
a40382333b Fix the name of the "End Opacity" condition of the particle emitters (#4214) 2022-08-21 16:47:43 +02:00
Florian Rival
fb95f26fbb Update artifacts download script to include arm64 build artifacts [skip ci] [ci skip]
Don't show in changelog
2022-08-18 10:14:08 +02:00
Florian Rival
48a90ae86d Display a super thin or invisible scrollbars for the toolbar and tabs, according to the browser 2022-08-18 09:16:49 +02:00
Florian Rival
6303a50a9d Enable macOS build for Apple Silicon and arm64 builds for Linux (#4031) 2022-08-17 16:02:25 +02:00
D8H
a47ec5199e Limit the number of autocompletion elements displayed for extensions search tags. (#4207)
Don't show in changelog
2022-08-17 11:43:24 +02:00
D8H
a6921c2de3 Fix the extensions search bar that was only using the first 30 tags alphabetically (#4206) 2022-08-17 10:17:57 +02:00
Florian Rival
b21b6f0dfb Bump newIDE version 2022-08-16 18:01:34 +02:00
Florian Rival
c0d4480099 Update AdMob to declare AD_ID permission on Android, as required for Android 13 2022-08-16 17:50:53 +02:00
github-actions[bot]
56277ff5d3 Update translations [skip ci] (#4204)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-08-16 17:04:22 +02:00
Florian Rival
4fa1fbd5e2 Remove useless files being scanned for translations
Don't show in changelog
2022-08-16 16:51:30 +02:00
Florian Rival
f61ef1be2e Add monetization tab in game dashboard
* Allow to enable or disable ads on the game page if published on Liluo.io
* In the future, games that generate enough revenue will be able to opt-in into "revenue share", so that as a creator you can start earning from your game sessions.
* This also this allows to maintain free publishing on Liluo.io for all.
2022-08-16 16:40:52 +02:00
github-actions[bot]
bf387631ec Update translations [skip ci] (#4173)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-08-16 14:18:32 +02:00
Florian Rival
981752af26 Make compile-translations script more robust
Don't show in changelog
2022-08-16 14:09:52 +02:00
Florian Rival
58e5933c75 Update GDevelop logo in the about dialog
Don't show in changelog
2022-08-12 22:47:23 +02:00
Florian Rival
237ad8ce39 Show the full version number in the About dialog, and the update status for the web-app (#4202) 2022-08-12 20:41:23 +02:00
Florian Rival
02225cb0ec Move the preferences button in the home page (#4201)
* Also display the full GDevelop version number in the "About GDevelop" button in the home page - useful to check if you're on the latest version when using the web-app
2022-08-12 19:26:09 +02:00
Florian Rival
b34426e084 Add support for Android 12 splashscreen icon (#4200) 2022-08-12 18:48:10 +02:00
Florian Rival
23c09f3472 Fix buttons to download exported games not shown as primary buttons 2022-08-12 17:01:59 +02:00
D8H
59a7690748 Fix the "move parameter" refactor for expressions in the extension editor (#3968) 2022-08-12 14:04:12 +02:00
Aurélien Vivet
3e97d4b878 Clarify the name of the actions to resume a paused sound/music (#4199) 2022-08-12 12:20:27 +02:00
Florian Rival
d710dd0335 Fix sourcemap of Box2D wasm source wrongly included when exporting
Don't show in changelog
2022-08-11 21:53:13 +02:00
Aurélien Vivet
78695b6b17 Fix wrong description of Firebase "Check for a document's existence" action (#4198) 2022-08-11 21:48:24 +02:00
Florian Rival
4e3dec4356 Upgrade Admob so that it works with the latest Android SDK, required to publish apps on the Play Store (#4197) 2022-08-11 17:33:40 +02:00
D8H
f373e3b8d1 Fix the export of game using Box2d WASM library (#4195)
Don't show in changelog
2022-08-11 15:42:47 +02:00
Clément Pasteau
3e71c3a63f Fix saving project after creation (#4194)
Do not show in changelog
2022-08-10 11:31:49 +02:00
Clément Pasteau
86cad044d4 Add a test button to display staging assets in dev (#4170)
Do not show in changelog
2022-08-10 11:18:03 +02:00
Florian Rival
21b525ab98 Fix raycast condition not working properly on objects with multiple hitboxes (#4186) 2022-08-09 11:21:57 +02:00
Clément Pasteau
fb328fd0f5 Install fixes (#4190)
Do not show in changelog
2022-08-09 10:06:49 +02:00
Aurélien Vivet
afdb934a8a Fix typo (#4191) 2022-08-08 17:56:41 +02:00
AlexandreS
530f756e47 Add possibility to seal an instance (impossible to select it on the canvas) 2022-08-08 14:20:11 +02:00
Sebastian Krzyszkowiak
b1fb207a08 Minimize in game/real cursor flickering when showing/hiding the cursor (#4184) 2022-08-05 23:17:35 +02:00
Florian Rival
5f87213ccd Improve messages when reaching the maximum count of cloud projects 2022-08-05 22:56:21 +02:00
Florian Rival
9065454bfe Add more cloud projects for GDevelop online subscribers (#4183)
Don't show in changelog
2022-08-05 18:33:14 +02:00
Florian Rival
801fbb4b10 Fix orange outline sometimes appearing around the scene editor canvas 2022-08-05 18:29:22 +02:00
D8H
cfa538ec3d Fix the collision mask of rotated tiles that were sometimes misplaced (#4181) 2022-08-05 18:10:06 +02:00
D8H
504443dea4 Fix a game analytics test (#4182)
It was building data with fixed dates that were processed using the real today date.
Don't show in change logs.
2022-08-05 16:56:39 +02:00
Florian Rival
bdbc665d2e Fix exported WebManifest file having a syntax error when the game description has line breaks
Fix #4180
2022-08-05 09:13:25 +02:00
D8H
1d77f2da23 Replace the Box2D library with a WebAssembly one (#4153)
* It fixes a crash of the old Box2D library when a lot of objects with the Physics2 behavior were created.
* The same version of Box2d (2.3.1) is still used so there should not be any behavior change.
2022-08-04 18:11:00 +02:00
AlexandreS
7b6aa78aeb Fix memory leak at the end of a cloud project save (#4178)
Do not show in changelog
2022-08-04 16:19:09 +02:00
AlexandreS
e9aaed9d41 Fix json resource removed from project resources although it is used in event 2022-08-04 14:05:42 +02:00
Florian Rival
982c9e38c1 Add support for subscribing to GDevelop premium accounts with PayPal (#4166)
* You can now get a subscription, support GDevelop development and get more one-click online exports every day, using PayPal (or using credit cards as done previously).
2022-08-03 23:00:08 +02:00
Arthur Pacaud
c86388018c Add tween actions for camera zoom and camera rotation (#4174) 2022-08-03 22:21:45 +02:00
AlexandreS
6ae1b62df7 Add possibility to remove a project from the recent project list
Do not show in changelog
2022-08-03 17:42:33 +02:00
AlexandreS
ea745a49d7 Set storage provider before opening file metadata (#4175)
Do not show in changelog
2022-08-03 17:28:16 +02:00
AlexandreS
48fc2f640b Fix google drive project display in build section
Do not show in changelog
2022-08-03 16:31:15 +02:00
github-actions[bot]
a86ee8c338 Update translations [skip ci] (#4139)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-08-03 15:52:37 +02:00
AlexandreS
1787b3c5c8 Improve communication around cloud projects
Do not show in changelog
2022-08-03 15:42:20 +02:00
D8H
3e246e3cf0 Fix the loading of tile map atlases that was aborted when the image contains unused pixels at the right or bottom. (#4167) 2022-08-02 10:53:04 +02:00
AlexandreS
5035d16bd4 Improve game dashboard naming
Do not show in changelog
2022-08-01 17:04:41 +02:00
AlexandreS
2f6109a21c Display a custom error message when user has too may cloud projects
Do not show in changelog
2022-08-01 14:42:21 +02:00
D8H
0792fdadc7 Fix the tile map collision mask debug rendering that wasn't refreshed when there was no collision condition nor bahavior (#4162) 2022-08-01 10:21:17 +02:00
Clément Pasteau
0ca596e287 Remove scrolling on liluo iframe (#4159) 2022-07-29 18:13:27 +02:00
Florian Rival
899a252ddd Fix starters shown at the bottom of the example list on Firefox 2022-07-29 17:32:50 +02:00
AlexandreS
d92bf23e58 Fix double opening of project
Do not show in changelog
2022-07-29 15:11:20 +02:00
AlexandreS
37ae451178 Improve Homepage project list with more context actions and better display for local projects 2022-07-29 14:30:36 +02:00
Clément Pasteau
9c47a92ea6 Move asset store actions to be at the bottom of the dialog 2022-07-29 13:22:34 +02:00
Aurélien Vivet
1afd4b94be Fix a typo: Remove a double from (#4154)
Don't show in the changelog
2022-07-29 10:47:07 +02:00
Clément Pasteau
4d5a3f499f Rework play section to display Liluo games (#4151)
* Rework play section to display Liluo games

* ensure message origin
2022-07-29 10:12:02 +02:00
AlexandreS
13da1c56fd Add GDevelop own Cloud storage for web-app project
In order to make the life easier for our users on the web-app, we created GDevelop's cloud storage.
With a GDevelop account on the web-app, you can now save your project online and retrieve it from any device.
2022-07-28 15:26:41 +02:00
Clément Pasteau
8131ffcdb5 Fix Asset cards text color to be visible on light theme (#4152) 2022-07-28 14:55:39 +02:00
AlexandreS
77f948bfbf Improve search and replace in event sheet
- Fix a bug that hangs GDevelop when replacing with an empty search text
- Allow to replace with an empty string to mimic a "Delete search text" feature
2022-07-27 15:33:28 +02:00
D8H
c6abfc5433 Add type definitions on the Physics2 extension (#4147) 2022-07-27 09:47:32 +02:00
Florian Rival
2777e458ae Fix Add condition/action buttons overflowing outside of their column on small screens 2022-07-26 23:13:19 +02:00
Florian Rival
1d0695d722 Improve again rendering of the examples list on small screens
Don't show in changelog
2022-07-26 23:00:33 +02:00
Florian Rival
1820575f52 Fix display of the examples/starters on small screens (#4146) 2022-07-26 18:16:41 +02:00
Arthur Pacaud
f62236788d Add various improvements to the P2P extension (#4145)
- Updated PeerJS.
- Fixes for Safari.
- Improved typings.
- New default TURN server.
- Add a JavaScript API to get access to the raw connection.
  This allows to send custom messages from JavaScript. This allows to use a binary protocol from JavaScript.
- Use Map instead of JavaScript objects in places where it makes sense (more performant and less error prone).
- Avoid making a redundant get for every connection on the map containing the connections.

Only show in developer changelog
2022-07-26 14:25:08 +02:00
D8H
247e2f39e0 Add actions to change the tile map dimensions (#4141) 2022-07-26 09:20:27 +02:00
D8H
30898058a4 Fix layer names in drop-down lists were translated even though they are defined by users (#4130) 2022-07-25 18:53:30 +02:00
D8H
4e5d268f63 Handle tile maps with invalid resources (#4140)
* Fix an uncatched exceptions when a tile map resource is not set.
* Show place-holders for tile map with invalid resources in the instances editor.
* Give a better default name to tile map collision mask objects.
* Add a border around the tile map collision mask objects in the instance editor.
2022-07-25 17:33:08 +02:00
github-actions[bot]
fc4072b055 Update translations [skip ci] (#4132)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-07-25 11:18:38 +02:00
Clément Pasteau
9adec3ac72 Fix manual export URLs crashing the app on web (#4138) 2022-07-25 11:17:35 +02:00
D8H
95c2efbe07 Fix tilemaps object boxes to keep the empty tiles margins (#4133)
* It makes the same boxes as the tilemaps collision mask object to ease positioning.
* If the extra margin is not intended the right size can be set with Tiled.
2022-07-25 10:51:20 +02:00
Florian Rival
5a71b3a05f Add the unit (milliseconds) in the Tween behavior action parameters (#4137) 2022-07-24 22:23:35 +02:00
Florian Rival
fe87150cd4 Fix rendering of the home page on Safari (#4136) 2022-07-24 20:14:10 +02:00
Florian Rival
ddd3dc095a Fix wrong colors on the progress bar of the leaderboard creation dialog (#4135)
Don't show in changelog
2022-07-24 18:49:19 +02:00
Florian Rival
43bd02f99f Fix groups being redlined in the events sheet (#4134)
Do not show in changelog
2022-07-24 16:05:47 +02:00
github-actions[bot]
7ebf3c559b Update translations [skip ci] (#4122)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-07-22 14:04:30 +02:00
D8H
a5dca5fcb7 Fix: tilemaps were making the webapp crash due to a broken link. (#4131) 2022-07-22 14:03:19 +02:00
VegeTato
179a130d30 Update AboutDialog.js (#4127)
Added my twitter link beside my name :)
2022-07-22 11:00:50 +02:00
Peter Anderson
9953d33764 Issue #4119: Fix colours of expanded/collapsed arrows on event sheet. (#4129) 2022-07-22 10:58:58 +02:00
Clément Pasteau
5cb8603b56 Reduce max size of get started tiles (#4126)
Do not show in changelog
2022-07-22 10:10:04 +02:00
D8H
5278628480 Show typing errors of object parameters directly on the event sheet (#4121) 2022-07-21 09:23:40 +02:00
github-actions[bot]
99b615c573 Update translations [skip ci] (#4117)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-07-19 11:34:30 +02:00
Clément Pasteau
0ffc88a470 Small fixes (#4116)
Do not show in changelog
2022-07-18 18:25:27 +02:00
Clément Pasteau
b389b3cc90 Fix onboarding flow for web (#4115) 2022-07-18 16:22:50 +02:00
Clément Pasteau
41a70ec1e7 Bump IDE version to 139 (#4113) 2022-07-18 12:26:07 +02:00
D8H
1844d826f9 [PathFinding] Add a warn for too long searches (#4112)
* Don't show in changelogs
2022-07-18 12:25:54 +02:00
github-actions[bot]
e7e45e9c9b Update translations [skip ci] (#4102)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-07-18 12:14:34 +02:00
Clément Pasteau
7f7dc0e07f Final fixes release 139 (#4111)
* Fix MultiAutoComplete resetting after each input
* Always open a scene when opening a project
2022-07-18 12:13:43 +02:00
D8H
7af0153ceb [Platformer] Fix: platformer characters can now jump when moving against a wall that is part of the same object as the floor. (#4106)
* This bug could happen when using a tilemap collision mask object and not sustaining the jump.
2022-07-18 12:07:15 +02:00
D8H
9aaabbcc1d Fix the box of collision masks in the editor (#4105)
* Don't show in changelogs
2022-07-18 10:14:56 +02:00
Florian Rival
55cc75e990 Update wording of games not visible on Liluo on the games dashboard
Don't show in changelog
2022-07-13 18:47:19 +02:00
AlexandreS
d3d6c50790 Fix custom tooltip crashing when payload is undefined (#4101)
Don't show in changelog
2022-07-13 18:04:05 +02:00
github-actions[bot]
c7f2e4312c Update translations [skip ci] (#4058)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-07-13 15:49:36 +02:00
Peter Anderson
38cff7bbce Fix typos: replace 'Musics' with 'Music' (#4099) 2022-07-13 15:36:27 +02:00
AlexandreS
761de213ac Fix tabs and links colors
Do not show in changelog
2022-07-13 15:14:05 +02:00
D8H
f871b64011 [TileMap] Collision mask object (#3313)
* The collision mask is read from the tile maps exported by Tiled 1.9+.
* Several collision masks can be used for instance to have platforms and ladders.
* Take a look to the wiki for more details https://wiki.gdevelop.io/gdevelop5/objects/tilemap
2022-07-13 15:12:12 +02:00
AlexandreS
9441d3a2d2 Adapt themes' colors for better contrast across the app 2022-07-13 11:31:36 +02:00
Florian Rival
e86348727e Add a button, in the Profile, to manage online the subscription to GDevelop services (#4096)
This allows to easily update a payment method or switch to another plan/cancel (though this can already be done from the interface)
2022-07-13 10:59:41 +02:00
Peter Anderson
754845e5cd Fix grammar for the description of the Platform behavior (#4098) 2022-07-13 10:49:50 +02:00
Fannie Yan
1b86c23b92 Replace leaderboards when a user opens a game template (#4094)
* Replace leaderboards when a user opens a game template
2022-07-12 15:33:55 +02:00
AlexandreS
3c44602486 Fix Physics2 behaviors (#4074)
* Make it possible to activate and reactivate physics 2 behaviour
* Fix behaviour for objects modified or destroyed during events life cycle
* Make Physics2 Collision condition valid in any step of behaviour life cycles
2022-07-12 14:46:49 +02:00
D8H
b0f1e962a4 Automatically select and rename new behaviors or functions in the extension editor (#4092) 2022-07-11 16:27:22 +02:00
D8H
c48c86a51f Make radian or degree explicit in descriptions for angles (#4091) 2022-07-11 14:47:21 +02:00
Florian Rival
2b83ec9871 Revert color changes in themes (#4089)
* Primary color is the one that is displaying well, with good contrast, on the background.
* Secondary is the "accent" one that works well for raised button, selected buttons, etc...

Don't show in changelog
2022-07-11 10:36:15 +02:00
Florian Rival
c340f8ad06 Fix display of games showcase
Don't show in changelog
2022-07-08 17:53:41 +02:00
Clément Pasteau
07341f1e00 Improve the new Homepage Learn section by categorising tutorials
* Tutorials are now organised into Full Games, Game Mechanics, and official videos from Beginner to Advanced!
2022-07-08 16:06:57 +02:00
Sebastian Krzyszkowiak
7402d4f29f Add an option in the Resources editor to preload audio files in cache without decoding (#4010)
* This is helpful to load the audio files at the loading of the game (so even if the internet connection is lost, they will be available in the "browser cache") but without decoding them in memory (which could make too much work for low end devices, resulting in crashes)
2022-07-07 12:56:32 +02:00
AlexandreS
8599a1cfa7 Allow to display up to 50 leaderboard entries in Liluo/in-game 2022-07-06 15:39:59 +02:00
Clément Pasteau
98bfc7a4e0 Revamp GDevelop Homepage
* New "Get Started" section, to guide newcomers on where to start with GDevelop
* New "Build" section, the entry point for your projects
* New "Learn" section, the entry point to tutorials and future help tools
* New "Play" section, the entry point for all games created with GDevelop
* New "Community" section, the entry point to stay informed with the GDevelop world
2022-07-06 14:00:46 +02:00
D8H
cef352276d Add a duplicate action in the functions lists contextual menu. (#4085) 2022-07-06 12:33:52 +02:00
Fannie Yan
49ea27fd54 Slightly rework games dashboard (#4084)
Don't show in changelog
2022-07-06 12:12:24 +02:00
D8H
23b5b16bdf Select copied element on behaviors and functions lists (#4083) 2022-07-06 11:06:12 +02:00
Arthur Pacaud
2124133b4a Add an option to wait for a network request action to end before running other actions (#4023)
* In the future, there will be other actions where you can optionally wait for their tasks to be finished before running the rest of the actions. It makes logic easier and more straightforward to express in events.
* This is similar to the Wait action, except that it's optional.
2022-07-05 23:58:08 +02:00
Florian Rival
905344f396 Fix contrast of expressions in Rosé Pine theme 2022-07-05 15:08:43 +02:00
Florian Rival
84b78dfe0f Order extensions according to what is specified in the extensions repository (#4080)
Don't show in changelog
2022-07-03 22:47:18 +02:00
Ehan
1d8086b2f4 Add a new "Rosé Pine" theme (Code Editor & UI Theme) (#4079)
* Based on https://rosepinetheme.com/ and adapted by @EhanAhamed for GDevelop.
2022-07-03 18:20:19 +02:00
Florian Rival
22d5d46601 Add a toggle to display community extensions (#4078)
* Community extensions are extensions made by a community member, but which are not reviewed by the GDevelop extension team.
  They can be useful, but also need to be carefully reviewed if you use some (inspect them or reach out to their author in case of doubt).
* If you want to submit an extension, see the [GitHub repository of community extensions](https://github.com/gdevelopapp/gdevelop-extensions).
2022-07-02 13:36:37 +02:00
Fannie Yan
a5d56c37c9 Allow user to manage builds (#4075)
* In build tab:
  - Allow users to edit build names
  - Allow users to delete builds
* In feedback tab:
  - Display build name if a feedback is linked to one and allow users to filter feedbacks on builds
2022-07-01 10:44:29 +02:00
Florian Rival
5025ad9fb9 Avoid bad expression warnings in the console when using force actions without changing the force type (#4073) 2022-06-30 19:20:32 +02:00
D8H
daae78e802 Add version locks for rechart. (#4076)
Don't show in changelogs.
2022-06-30 16:28:02 +02:00
Florian Rival
9ee4b704da Clean more deprecated include files in extensions (#4072)
Don't show in changelog
2022-06-30 12:09:17 +02:00
D8H
a8991b7c9b Add game analytics charts (#4046)
The game dash board shows new charts to understand how well a game is doing on several aspects:
* the popularity (number of players)
* the player engagement (how long the game is played)

Note that players data are anonymized.
2022-06-30 12:06:03 +02:00
Florian Rival
cf061638b8 Avoid warnings in the console during preview/export by cleaning old C++ include files (#4070)
Only show in developer changelog
2022-06-28 19:26:25 +02:00
Arthur Pacaud
0686e02e27 Don't show objects already in a group in the selector to add a new object to this group (#4069) 2022-06-28 10:52:46 +02:00
Arthur Pacaud
e65b576e4b Adding actions to tween the value of a scene variable or a layer camera position (#4022)
* Like tweens added on objects, these tweens can be manipulated: paused, resumed or stopped.
2022-06-27 23:56:16 +02:00
Florian Rival
aacfed02a1 Allow the web-app to use relative resources if found when the project is opened from a public URL (#4066)
* For example, this can be useful to open a desktop project stored on a public space like GitHub (using the "raw" raw.githubusercontent.com/... urls given by GitHub)

Only show in developer changelog
2022-06-27 15:59:13 +02:00
Fannie Yan
6a25a9ad77 Allow user to open their games for feedbacks (#4045)
* Rework slighlty the game dashboard to allow users to make their game discoverable on Liluo.io, add a banner asking for feedback on their game pages on Liluo.io and add a banner asking for feedback on their build pages
* Add a tab Feedback when managing games, accessible through the games dashboard that allows users to see and process the feedbacks given to their game.
2022-06-27 15:23:43 +02:00
Clément Pasteau
e1140609d0 Add a button to start (or redo) the onboarding on the homepage
* Also add new languages FR, PT & ES
2022-06-27 15:18:15 +02:00
AlexandreS
81ef11163d Bump newIDE version 2022-06-21 16:41:38 +02:00
AlexandreS
fcc19a6dcf Fix collision bug introduced when fixing a collision bug 2022-06-21 16:41:18 +02:00
github-actions[bot]
bcad2d5667 Update translations [skip ci] (#4042)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-06-21 16:01:54 +02:00
D8H
3c83e5d24a No longer count pauses (when the tab is hidden) for the players session duration statistics (#4054) 2022-06-21 15:04:41 +02:00
757 changed files with 48087 additions and 14836 deletions

View File

@@ -68,7 +68,7 @@ jobs:
- run:
name: Clean dist folder to keep only installers/binaries.
command: rm -rf "newIDE/electron-app/dist/mac/GDevelop 5.app"
command: rm -rf "newIDE/electron-app/dist/mac/GDevelop 5.app" && rm -rf "newIDE/electron-app/dist/mac-arm64/GDevelop 5.app"
# Upload artifacts (CircleCI)
- store_artifacts:
@@ -143,11 +143,11 @@ jobs:
# Build GDevelop IDE (seems like we need to allow Node.js to use more space than usual)
- run:
name: Build GDevelop IDE
command: export NODE_OPTIONS="--max-old-space-size=7168" && cd newIDE/electron-app && npm run build -- --linux AppImage zip deb --publish=never
command: export NODE_OPTIONS="--max-old-space-size=7168" && cd newIDE/electron-app && npm run build -- --linux --publish=never
- run:
name: Clean dist folder to keep only installers/binaries.
command: rm -rf newIDE/electron-app/dist/linux-unpacked
command: rm -rf newIDE/electron-app/dist/linux-unpacked && rm -rf newIDE/electron-app/dist/linux-arm64-unpacked
# Upload artifacts (CircleCI)
- store_artifacts:

View File

@@ -468,6 +468,14 @@ gd::String EventsCodeGenerator::GenerateActionCode(
action, *this, context);
}
// Get the correct function name depending on whether it should be async or
// not.
const gd::String& functionCallName =
instrInfos.IsAsync() &&
(!instrInfos.IsOptionallyAsync() || action.IsAwaited())
? instrInfos.codeExtraInformation.asyncFunctionCallName
: instrInfos.codeExtraInformation.functionCallName;
// Be sure there is no lack of parameter.
while (action.GetParameters().size() < instrInfos.parameters.size()) {
vector<gd::Expression> parameters = action.GetParameters();
@@ -522,6 +530,7 @@ gd::String EventsCodeGenerator::GenerateActionCode(
action.GetParameters(), instrInfos.parameters, context);
actionCode += GenerateObjectAction(realObjects[i],
objInfo,
functionCallName,
arguments,
instrInfos,
context,
@@ -556,6 +565,7 @@ gd::String EventsCodeGenerator::GenerateActionCode(
GenerateBehaviorAction(realObjects[i],
action.GetParameter(1).GetPlainString(),
autoInfo,
functionCallName,
arguments,
instrInfos,
context,
@@ -567,8 +577,11 @@ gd::String EventsCodeGenerator::GenerateActionCode(
} else {
vector<gd::String> arguments = GenerateParametersCodes(
action.GetParameters(), instrInfos.parameters, context);
actionCode +=
GenerateFreeAction(arguments, instrInfos, context, optionalAsyncCallbackName);
actionCode += GenerateFreeAction(functionCallName,
arguments,
instrInfos,
context,
optionalAsyncCallbackName);
}
return actionCode;
@@ -678,7 +691,8 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
} else if (ParameterMetadata::IsObject(metadata.type)) {
// It would be possible to run a gd::ExpressionCodeGenerator if later
// objects can have nested objects, or function returning objects.
argOutput = GenerateObject(parameter.GetPlainString(), metadata.type, context);
argOutput =
GenerateObject(parameter.GetPlainString(), metadata.type, context);
} else if (metadata.type == "relationalOperator") {
auto parameterString = parameter.GetPlainString();
argOutput += parameterString == "=" ? "==" : parameterString;
@@ -716,13 +730,15 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
argOutput = "\"" + ConvertToString(parameter.GetPlainString()) + "\"";
} else if (metadata.type == "yesorno") {
auto parameterString = parameter.GetPlainString();
argOutput += (parameterString == "yes" || parameterString == "oui") ? GenerateTrue()
: GenerateFalse();
argOutput += (parameterString == "yes" || parameterString == "oui")
? GenerateTrue()
: GenerateFalse();
} else if (metadata.type == "trueorfalse") {
auto parameterString = parameter.GetPlainString();
// This is duplicated in AdvancedExtension.cpp for GDJS
argOutput += (parameterString == "True" || parameterString == "Vrai") ? GenerateTrue()
: GenerateFalse();
argOutput += (parameterString == "True" || parameterString == "Vrai")
? GenerateTrue()
: GenerateFalse();
}
// Code only parameter type
else if (metadata.type == "inlineCode") {
@@ -1082,6 +1098,7 @@ gd::String EventsCodeGenerator::GenerateBehaviorCondition(
}
gd::String EventsCodeGenerator::GenerateFreeAction(
const gd::String& functionCallName,
const std::vector<gd::String>& arguments,
const gd::InstructionMetadata& instrInfos,
gd::EventsCodeGenerationContext& context,
@@ -1095,21 +1112,21 @@ gd::String EventsCodeGenerator::GenerateFreeAction(
call = GenerateOperatorCall(
instrInfos,
arguments,
instrInfos.codeExtraInformation.functionCallName,
functionCallName,
instrInfos.codeExtraInformation.optionalAssociatedInstruction);
else if (instrInfos.codeExtraInformation.accessType ==
gd::InstructionMetadata::ExtraInformation::Mutators)
call =
GenerateMutatorCall(instrInfos,
arguments,
instrInfos.codeExtraInformation.functionCallName);
functionCallName);
else
call = GenerateCompoundOperatorCall(
instrInfos,
arguments,
instrInfos.codeExtraInformation.functionCallName);
functionCallName);
} else {
call = instrInfos.codeExtraInformation.functionCallName + "(" +
call = functionCallName + "(" +
GenerateArgumentsList(arguments) + ")";
}
@@ -1123,6 +1140,7 @@ gd::String EventsCodeGenerator::GenerateFreeAction(
gd::String EventsCodeGenerator::GenerateObjectAction(
const gd::String& objectName,
const gd::ObjectMetadata& objInfo,
const gd::String& functionCallName,
const std::vector<gd::String>& arguments,
const gd::InstructionMetadata& instrInfos,
gd::EventsCodeGenerationContext& context,
@@ -1136,27 +1154,25 @@ gd::String EventsCodeGenerator::GenerateObjectAction(
call = GenerateOperatorCall(
instrInfos,
arguments,
instrInfos.codeExtraInformation.functionCallName,
functionCallName,
instrInfos.codeExtraInformation.optionalAssociatedInstruction,
2);
else
call = GenerateCompoundOperatorCall(
instrInfos,
arguments,
instrInfos.codeExtraInformation.functionCallName,
2);
instrInfos, arguments, functionCallName, 2);
return "For each picked object \"" + objectName + "\", call " + call +
".\n";
} else {
gd::String argumentsStr = GenerateArgumentsList(arguments, 1);
call = instrInfos.codeExtraInformation.functionCallName + "(" +
argumentsStr + ")";
call = functionCallName + "(" + argumentsStr + ")";
return "For each picked object \"" + objectName + "\", call " + call + "(" +
argumentsStr + ")" +
(optionalAsyncCallbackName.empty() ? "" : (", then call" + optionalAsyncCallbackName)) +
(optionalAsyncCallbackName.empty()
? ""
: (", then call" + optionalAsyncCallbackName)) +
".\n";
}
}
@@ -1165,6 +1181,7 @@ gd::String EventsCodeGenerator::GenerateBehaviorAction(
const gd::String& objectName,
const gd::String& behaviorName,
const gd::BehaviorMetadata& autoInfo,
const gd::String& functionCallName,
const std::vector<gd::String>& arguments,
const gd::InstructionMetadata& instrInfos,
gd::EventsCodeGenerationContext& context,
@@ -1178,26 +1195,28 @@ gd::String EventsCodeGenerator::GenerateBehaviorAction(
call = GenerateOperatorCall(
instrInfos,
arguments,
instrInfos.codeExtraInformation.functionCallName,
functionCallName,
instrInfos.codeExtraInformation.optionalAssociatedInstruction,
2);
else
call = GenerateCompoundOperatorCall(
instrInfos,
arguments,
instrInfos.codeExtraInformation.functionCallName,
functionCallName,
2);
return "For each picked object \"" + objectName + "\", call " + call +
" for behavior \"" + behaviorName + "\".\n";
} else {
gd::String argumentsStr = GenerateArgumentsList(arguments, 2);
call = instrInfos.codeExtraInformation.functionCallName + "(" +
call = functionCallName + "(" +
argumentsStr + ")";
return "For each picked object \"" + objectName + "\", call " + call + "(" +
argumentsStr + ")" + " for behavior \"" + behaviorName + "\"" +
(optionalAsyncCallbackName.empty() ? "" : (", then call" + optionalAsyncCallbackName)) +
(optionalAsyncCallbackName.empty()
? ""
: (", then call" + optionalAsyncCallbackName)) +
".\n";
}
}

View File

@@ -154,9 +154,10 @@ class GD_CORE_API EventsCodeGenerator {
* \param context Context used for generation
* \return Code
*/
gd::String GenerateActionCode(gd::Instruction& action,
EventsCodeGenerationContext& context,
const gd::String& optionalAsyncCallbackName = "");
gd::String GenerateActionCode(
gd::Instruction& action,
EventsCodeGenerationContext& context,
const gd::String& optionalAsyncCallbackName = "");
struct CallbackDescriptor {
CallbackDescriptor(const gd::String functionName_,
@@ -174,7 +175,8 @@ class GD_CORE_API EventsCodeGenerator {
*/
const gd::String argumentsList;
/**
* A set of all objects that need to be backed up to be passed to the callback code.
* A set of all objects that need to be backed up to be passed to the
* callback code.
*/
const std::set<gd::String> requiredObjects;
};
@@ -507,10 +509,10 @@ class GD_CORE_API EventsCodeGenerator {
* - currentScene: Reference to the current runtime scene.
* - objectList : a map containing lists of objects which are specified by the
object name in another parameter.
* - objectListOrEmptyIfJustDeclared : Same as `objectList` but do not pick object if
they are not already picked.
* - objectPtr: Return a reference to the object specified by the object name in
another parameter. Example:
* - objectListOrEmptyIfJustDeclared : Same as `objectList` but do not pick
object if they are not already picked.
* - objectPtr: Return a reference to the object specified by the object name
in another parameter. Example:
* \code
.AddParameter("object", _("Object"))
.AddParameter("objectPtr", _("Target object"))
@@ -700,6 +702,7 @@ class GD_CORE_API EventsCodeGenerator {
gd::EventsCodeGenerationContext& context);
virtual gd::String GenerateFreeAction(
const gd::String& functionCallName,
const std::vector<gd::String>& arguments,
const gd::InstructionMetadata& instrInfos,
gd::EventsCodeGenerationContext& context,
@@ -708,6 +711,7 @@ class GD_CORE_API EventsCodeGenerator {
virtual gd::String GenerateObjectAction(
const gd::String& objectName,
const gd::ObjectMetadata& objInfo,
const gd::String& functionCallName,
const std::vector<gd::String>& arguments,
const gd::InstructionMetadata& instrInfos,
gd::EventsCodeGenerationContext& context,
@@ -717,6 +721,7 @@ class GD_CORE_API EventsCodeGenerator {
const gd::String& objectName,
const gd::String& behaviorName,
const gd::BehaviorMetadata& autoInfo,
const gd::String& functionCallName,
const std::vector<gd::String>& arguments,
const gd::InstructionMetadata& instrInfos,
gd::EventsCodeGenerationContext& context,
@@ -775,8 +780,8 @@ class GD_CORE_API EventsCodeGenerator {
bool hasProjectAndLayout; ///< true only if project and layout are valid
///< references. If false, they should not be used.
const gd::Project* project; ///< The project being used.
const gd::Layout* scene; ///< The scene being generated.
const gd::Project* project; ///< The project being used.
const gd::Layout* scene; ///< The scene being generated.
bool errorOccurred; ///< Must be set to true if an error occured.
bool compilationForRuntime; ///< Is set to true if the code generation is

View File

@@ -75,7 +75,8 @@ void BaseEvent::PreprocessAsyncActions(const gd::Platform& platform) {
const auto& action = actionsList->at(aId);
const gd::InstructionMetadata& actionMetadata =
gd::MetadataProvider::GetActionMetadata(platform, action.GetType());
if (actionMetadata.IsAsync()) {
if (actionMetadata.IsAsync() &&
(!actionMetadata.IsOptionallyAsync() || action.IsAwaited())) {
gd::InstructionsList remainingActions;
remainingActions.InsertInstructions(
*actionsList, aId + 1, actionsList->size() - 1);

View File

@@ -72,6 +72,22 @@ class GD_CORE_API Instruction {
*/
void SetInverted(bool inverted_) { inverted = inverted_; }
/**
* \brief Return true if the async instruction should be awaited.
* This is not relevant if the instruction is not optionally asynchronous.
*
* \return true if the instruction is to be awaited
*/
bool IsAwaited() const { return awaitAsync; }
/**
* \brief Set if the async instruction is to be awaited or not.
* This is not relevant if the instruction is not optionally asynchronous.
*
* \param inverted true if the instruction must be awaited
*/
void SetAwaited(bool awaited) { awaitAsync = awaited; }
/**
* \brief Return the number of parameters of the instruction.
*/
@@ -139,7 +155,9 @@ class GD_CORE_API Instruction {
* Useful to get reference to the original instruction in memory during code
* generation, to ensure stable unique identifiers.
*/
std::weak_ptr<Instruction> GetOriginalInstruction() { return originalInstruction; };
std::weak_ptr<Instruction> GetOriginalInstruction() {
return originalInstruction;
};
friend std::shared_ptr<Instruction> CloneRememberingOriginalElement(
std::shared_ptr<Instruction> instruction);
@@ -148,6 +166,9 @@ class GD_CORE_API Instruction {
gd::String type; ///< Instruction type
bool inverted; ///< True if the instruction if inverted. Only applicable for
///< instruction used as conditions by events
bool awaitAsync =
false; ///< Tells the code generator whether the optionally asynchronous
///< instruction should be generated as asynchronous (awaited) or not.
mutable std::vector<gd::Expression>
parameters; ///< Vector containing the parameters
gd::InstructionsList subInstructions; ///< Sub instructions, if applicable.

View File

@@ -269,6 +269,9 @@ void gd::EventsListSerialization::UnserializeInstructionsFrom(
instrElement.GetChild("type", 0, "Type")
.GetBoolAttribute("inverted", false, "Contraire"));
instruction.SetAwaited(
instrElement.GetChild("type", 0, "Type").GetBoolAttribute("await"));
// Read parameters
vector<gd::Expression> parameters;
@@ -346,6 +349,8 @@ void gd::EventsListSerialization::SerializeInstructionsTo(
if (list[k].IsInverted())
instruction.GetChild("type").SetAttribute("inverted", true);
if (list[k].IsAwaited())
instruction.GetChild("type").SetAttribute("await", true);
// Parameters
SerializerElement& parameters = instruction.AddChild("parameters");

View File

@@ -14,14 +14,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
extension
.SetExtensionInformation(
"BuiltinAudio",
_("Sounds and musics"),
_("Sounds and music"),
_("GDevelop provides several conditions and actions to play audio "
"files. They can be either long musics or short sound effects."),
"files. They can be either long music or short sound effects."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/audio")
.SetCategory("Audio");
extension.AddInstructionOrExpressionGroupMetadata(_("Sounds and musics"))
extension.AddInstructionOrExpressionGroupMetadata(_("Sounds and music"))
.SetIcon("res/actions/music24.png");
extension
@@ -73,9 +73,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
extension
.AddAction("RePlaySoundCanal",
_("Play the sound of a channel"),
_("Play the sound of the channel."),
_("Play the sound of channel _PARAM1_"),
_("Resume playing a sound on a channel"),
_("Resume playing a sound on a channel that was paused."),
_("Resume the sound of channel _PARAM1_"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
@@ -132,9 +132,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
extension
.AddAction("RePlayMusicCanal",
_("Play the music of a channel"),
_("Play the music of the channel."),
_("Play the music of channel _PARAM1_"),
_("Resume playing a music on a channel"),
_("Resume playing a music on a channel that was paused."),
_("Resume the music of channel _PARAM1_"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")

View File

@@ -219,7 +219,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddAction("SetAngle",
_("Angle"),
_("Change the angle of rotation of an object."),
_("Change the angle of rotation of an object (in degrees)."),
_("the angle"),
_("Angle"),
"res/actions/direction24.png",
@@ -289,7 +289,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Speed on X axis (in pixels per second)"))
.AddParameter("expression", _("Speed on Y axis (in pixels per second)"))
.AddParameter("forceMultiplier", _("Force multiplier"));
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
.SetDefaultValue("0");
obj.AddAction("AddForceAL",
_("Add a force (angle)"),
@@ -305,7 +306,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
.SetDefaultValue("0")
.MarkAsAdvanced();
obj.AddAction(
@@ -323,7 +325,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("X position"))
.AddParameter("expression", _("Y position"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
.SetDefaultValue("0")
.MarkAsAdvanced();
obj.AddAction(
@@ -390,7 +393,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/layer.png")
.AddParameter("object", _("Object"))
.AddParameter("layer", _("Move it to this layer (base layer if empty)"))
.AddParameter("layer", _("Move it to this layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -756,7 +759,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectPtr", _("Target Object"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
.SetDefaultValue("0")
.MarkAsAdvanced();
obj.AddAction(
@@ -776,7 +780,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectPtr", _("Rotate around this object"))
.AddParameter("expression", _("Speed (in degrees per second)"))
.AddParameter("expression", _("Distance (in pixels)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.AddParameter("forceMultiplier", _("Force multiplier"), "", true)
.SetDefaultValue("0")
.MarkAsAdvanced();
obj.AddAction("MettreAutour",
@@ -993,7 +998,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddExpression("ForceAngle",
_("Angle of the sum of forces"),
_("Angle of the sum of forces"),
_("Angle of the sum of forces (in degrees)"),
_("Movement using forces"),
"res/actions/force.png")
.AddParameter("object", _("Object"));
@@ -1093,7 +1098,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("Target Y position"));
obj.AddExpression("Variable",
_("Object variable"),
_("Value of an object variable"),
_("Value of an object variable"),
_("Variables"),
"res/actions/var.png")
@@ -1109,7 +1114,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectvar", _("Variable"));
obj.AddStrExpression("VariableString",
_("Object variable"),
_("Text of an object variable"),
_("Text of an object variable"),
_("Variables"),
"res/actions/var.png")
@@ -1126,8 +1131,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddExpression("AngleToObject",
_("Angle between two objects"),
_("Compute the angle between two objects. If you need the "
"angle to an arbitrary position, use AngleToPosition."),
_("Compute the angle between two objects (in degrees). "
"If you need the angle to an arbitrary position, "
"use AngleToPosition."),
_("Angle"),
"res/actions/position.png")
.AddParameter("object", _("Object"))
@@ -1160,8 +1166,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddExpression("AngleToPosition",
_("Angle between an object and a position"),
_("Compute the angle between the object center and a "
"\"target\" position. If you need the angle between two "
"objects, use AngleToObject."),
"\"target\" position (in degrees). If you need the angle "
"between two objects, use AngleToObject."),
_("Angle"),
"res/actions/position.png")
.AddParameter("object", _("Object"))
@@ -1523,7 +1529,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"object will become the only one taken into account.\nIf "
"the condition is inverted, the object to be intersected "
"will be the farthest one within the ray radius."),
_("Cast a ray from from _PARAM1_;_PARAM2_ to _PARAM3_;_PARAM4_ "
_("Cast a ray from _PARAM1_;_PARAM2_ to _PARAM3_;_PARAM4_ "
"against _PARAM0_, and save the "
"result in _PARAM5_, _PARAM6_"),
"",

View File

@@ -195,7 +195,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"number",
"CameraAngle",
_("Angle of a camera of a layer"),
_("the angle of rotation of a camera"),
_("the angle of rotation of a camera (in degrees)"),
_("the angle of camera (layer: _PARAM3_, camera: _PARAM4_)"),
"",
"res/conditions/camera24.png")
@@ -221,7 +221,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Width"), "", true)
.AddParameter("expression", _("Height"), "", true)
@@ -256,7 +256,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"))
.MarkAsComplex();
@@ -272,7 +272,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"))
.AddParameter("expression", _("Width"))
@@ -290,7 +290,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"))
.AddParameter(
@@ -309,7 +309,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
extension
.AddAction("ZoomCamera",
_("Change camera zoom"),
_("Camera zoom"),
_("Change camera zoom."),
_("Change camera zoom to _PARAM1_ (layer: _PARAM2_, camera: "
"_PARAM3_)"),
@@ -413,7 +413,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -426,7 +426,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -439,7 +439,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/conditions/layer24.png",
"res/conditions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -576,7 +576,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
extension
.AddAction("SetLayerDefaultZOrder",
_("Change layer default Z order"),
_("Layer default Z order"),
_("Change the default Z order set to objects when they are "
"created on a layer."),
_("Set the default Z order of objects created on _PARAM1_ to "

View File

@@ -96,13 +96,13 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
_("Difference between two angles"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("First angle"))
.AddParameter("expression", _("Second angle"));
.AddParameter("expression", _("First angle, in degrees"))
.AddParameter("expression", _("Second angle, in degrees"));
extension
.AddExpression("AngleBetweenPositions",
_("Angle between two positions"),
_("Compute the angle between two positions."),
_("Compute the angle between two positions (in degrees)."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("First point X position"))
@@ -159,7 +159,8 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
extension
.AddExpression("acos",
_("Arccosine"),
_("Arccosine"),
_("Arccosine, return an angle (in radian). "
"`ToDeg` allows to convert it to degrees."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -175,7 +176,8 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
extension
.AddExpression("asin",
_("Arcsine"),
_("Arcsine"),
_("Arcsine, return an angle (in radian). "
"`ToDeg` allows to convert it to degrees."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -191,7 +193,8 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
extension
.AddExpression("atan",
_("Arctangent"),
_("Arctangent"),
_("Arctangent, return an angle (in radian). "
"`ToDeg` allows to convert it to degrees."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -258,7 +261,8 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
extension
.AddExpression("cos",
_("Cosine"),
_("Cosine of a number"),
_("Cosine of an angle (in radian). "
"If you want to use degrees, use`ToRad`: `sin(ToRad(45))`."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -400,7 +404,8 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
extension
.AddExpression("sin",
_("Sine"),
_("Sine of a number"),
_("Sine of an angle (in radian). "
"If you want to use degrees, use`ToRad`: `sin(ToRad(45))`."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -424,7 +429,8 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
extension
.AddExpression("tan",
_("Tangent"),
_("Tangent of a number"),
_("Tangent of an angle (in radian). "
"If you want to use degrees, use`ToRad`: `tan(ToRad(45))`."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));

View File

@@ -112,7 +112,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
extension
.AddAction("SceneBackground",
_("Change background color"),
_("Background color"),
_("Change the background color of the scene."),
_("Set background color to _PARAM1_"),
"",

View File

@@ -33,7 +33,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.SetCategoryFullName(_("General"));
obj.AddAction("Opacity",
_("Change sprite opacity"),
_("Sprite opacity"),
_("Change the opacity of a Sprite. 0 is fully transparent, 255 "
"is opaque (default)."),
_("the opacity"),

View File

@@ -21,9 +21,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/timers-and-time");
extension.AddInstructionOrExpressionGroupMetadata(
_("Timers and time")
)
extension.AddInstructionOrExpressionGroupMetadata(_("Timers and time"))
.SetIcon("res/conditions/timer24.png");
// Deprecated and replaced by CompareTimer
@@ -138,7 +136,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
extension
.AddAction("ChangeTimeScale",
_("Change time scale"),
_("Time scale"),
_("Change the time scale of the scene."),
_("Set the time scale of the scene to _PARAM1_"),
"",
@@ -158,8 +156,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/timer.svg",
"res/timer.svg")
.AddParameter("expression", "Time to wait in seconds")
.SetHelpPath("/all-features/timers-and-time/wait-action")
.SetAsync();
.SetHelpPath("/all-features/timers-and-time/wait-action");
extension
.AddExpression("TimeDelta",

View File

@@ -55,7 +55,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetWindowMargins",
_("Change the window's margins"),
_("Window's margins"),
_("This action changes the margins, in pixels, between the "
"game frame and the window borders."),
_("Set margins of game window to "
@@ -71,7 +71,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetGameResolutionSize",
_("Change the resolution of the game"),
_("Game resolution"),
_("Changes the resolution of the game, effectively changing "
"the game area size. This won't change the size of the "
"window in which the game is running."),
@@ -117,7 +117,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetGameResolutionResizeMode",
_("Change the game resolution resize mode"),
_("Game resolution resize mode"),
_("Set if the width or the height of the game resolution "
"should be changed to fit the game window - or if the game "
"resolution should not be updated automatically."),
@@ -153,7 +153,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetWindowIcon",
_("Change the window's icon"),
_("Window's icon"),
_("This action changes the icon of the game's window."),
_("Use _PARAM1_ as the icon for the game's window."),
"",
@@ -164,7 +164,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetWindowTitle",
_("Change the window's title"),
_("Window's title"),
_("This action changes the title of the game's window."),
_("Change window title to _PARAM1_"),
"",

View File

@@ -14,6 +14,8 @@
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/MakeUnique.h"
#include "GDCore/Tools/Log.h"
namespace gd {
@@ -29,21 +31,50 @@ BehaviorMetadata::BehaviorMetadata(
std::shared_ptr<gd::Behavior> instance_,
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance_)
: extensionNamespace(extensionNamespace_),
className(className_),
iconFilename(icon24x24),
instance(instance_),
sharedDatasInstance(sharedDatasInstance_) {
#if defined(GD_IDE_ONLY)
sharedDatasInstance(sharedDatasInstance_),
isEventBased(false) {
SetFullName(gd::String(fullname_));
SetDescription(gd::String(description_));
SetDefaultName(gd::String(defaultName_));
SetGroup(group_);
className = className_;
iconFilename = icon24x24;
#endif
if (!instance) {
gd::LogFatalError(
"Trying to create a BehaviorMetadata that has no "
"behavior. This will crash - please double check that the "
"BehaviorMetadata is valid for: " + name_);
}
if (instance) instance->SetTypeName(name_);
if (sharedDatasInstance) sharedDatasInstance->SetTypeName(name_);
}
BehaviorMetadata::BehaviorMetadata(
const gd::String& extensionNamespace,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& group_,
const gd::String& icon24x24_): BehaviorMetadata(
extensionNamespace,
name_,
fullname_,
// Default name is the name
name_,
description_,
group_,
icon24x24_,
// Class name is the name, actually unused
name_,
// It is only used to get the name for GetName.
gd::make_unique<gd::Behavior>("", name_),
nullptr){
isEventBased = true;
};
gd::InstructionMetadata& BehaviorMetadata::AddCondition(
const gd::String& name,
const gd::String& fullname,
@@ -52,7 +83,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddCondition(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
extensionNamespace.empty() ? name : extensionNamespace + name;
conditionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -66,7 +96,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddCondition(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return conditionsInfos[nameWithNamespace];
#endif
}
gd::InstructionMetadata& BehaviorMetadata::AddAction(
@@ -77,7 +106,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddAction(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
extensionNamespace.empty() ? name : extensionNamespace + name;
actionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -91,7 +119,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddAction(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return actionsInfos[nameWithNamespace];
#endif
}
gd::InstructionMetadata& BehaviorMetadata::AddScopedCondition(
@@ -102,7 +129,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedCondition(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
GetName() + gd::PlatformExtension::GetNamespaceSeparator() + name;
conditionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -116,7 +142,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedCondition(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return conditionsInfos[nameWithNamespace];
#endif
}
gd::InstructionMetadata& BehaviorMetadata::AddScopedAction(
@@ -127,7 +152,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedAction(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
GetName() + gd::PlatformExtension::GetNamespaceSeparator() + name;
actionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -141,7 +165,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedAction(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return actionsInfos[nameWithNamespace];
#endif
}
gd::ExpressionMetadata& BehaviorMetadata::AddExpression(
@@ -150,7 +173,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddExpression(
const gd::String& description,
const gd::String& group,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
// Be careful, behaviors expression do not have namespace (not necessary as
// we refer to the behavior name in the expression).
expressionsInfos[name] = ExpressionMetadata("number",
@@ -162,7 +184,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddExpression(
smallicon)
.SetHelpPath(GetHelpPath());
return expressionsInfos[name];
#endif
}
gd::ExpressionMetadata& BehaviorMetadata::AddStrExpression(
@@ -171,7 +192,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddStrExpression(
const gd::String& description,
const gd::String& group,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
// Be careful, behaviors expression do not have namespace (not necessary as
// we refer to the behavior name in the expression).
strExpressionsInfos[name] = ExpressionMetadata("string",
@@ -183,7 +203,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddStrExpression(
smallicon)
.SetHelpPath(GetHelpPath());
return strExpressionsInfos[name];
#endif
}
gd::MultipleInstructionMetadata BehaviorMetadata::AddExpressionAndCondition(
@@ -288,7 +307,6 @@ BehaviorMetadata::AddExpressionAndConditionAndAction(
expression, condition, action);
}
#if defined(GD_IDE_ONLY)
gd::InstructionMetadata& BehaviorMetadata::AddDuplicatedAction(
const gd::String& newActionName, const gd::String& copiedActionName) {
gd::String newNameWithNamespace = extensionNamespace + newActionName;
@@ -356,49 +374,44 @@ gd::ExpressionMetadata& BehaviorMetadata::AddDuplicatedStrExpression(
return strExpressionsInfos[newNameWithNamespace];
}
#endif
BehaviorMetadata& BehaviorMetadata::SetFullName(const gd::String& fullname_) {
#if defined(GD_IDE_ONLY)
fullname = fullname_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetDefaultName(
const gd::String& defaultName_) {
#if defined(GD_IDE_ONLY)
defaultName = defaultName_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetDescription(
const gd::String& description_) {
#if defined(GD_IDE_ONLY)
description = description_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetGroup(const gd::String& group_) {
#if defined(GD_IDE_ONLY)
group = group_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetIncludeFile(
const gd::String& includeFile) {
#if defined(GD_IDE_ONLY)
includeFiles.clear();
includeFiles.push_back(includeFile);
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::AddIncludeFile(
const gd::String& includeFile) {
#if defined(GD_IDE_ONLY)
if (std::find(includeFiles.begin(), includeFiles.end(), includeFile) ==
includeFiles.end())
includeFiles.push_back(includeFile);
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::AddRequiredFile(
const gd::String& requiredFile) {
if (std::find(requiredFiles.begin(), requiredFiles.end(), requiredFile) ==
requiredFiles.end())
requiredFiles.push_back(requiredFile);
return *this;
}
@@ -407,13 +420,25 @@ const gd::String& BehaviorMetadata::GetName() const {
}
gd::Behavior& BehaviorMetadata::Get() const {
if (!instance)
if (isEventBased) {
gd::LogFatalError("Error: Event-based behaviors don't have blueprint. "
"This method should not never be called.");
}
if (!instance) {
gd::LogFatalError(
"Trying to get a behavior from a BehaviorMetadata that has no "
"behavior. This will crash - please double check that the "
"BehaviorMetadata is valid.");
"BehaviorMetadata is valid for: " + className);
}
return *instance;
}
gd::BehaviorsSharedData* BehaviorMetadata::GetSharedDataInstance() const {
if (isEventBased) {
gd::LogFatalError("Error: Event-based behaviors don't have blueprint. "
"This method should not never be called.");
}
return sharedDatasInstance.get();
}
} // namespace gd

View File

@@ -38,6 +38,20 @@ class GD_CORE_API BehaviorMetadata {
const gd::String& className_,
std::shared_ptr<gd::Behavior> instance,
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
/**
* \brief Construct a behavior metadata, without "blueprint" behavior.
*
* \note This is used by events based behaviors.
*/
BehaviorMetadata(
const gd::String& extensionNamespace,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& group_,
const gd::String& icon24x24_);
BehaviorMetadata(){};
virtual ~BehaviorMetadata(){};
@@ -195,6 +209,13 @@ class GD_CORE_API BehaviorMetadata {
*/
BehaviorMetadata& AddIncludeFile(const gd::String& includeFile);
/**
* \brief Add a file to the already existing required files.
* \note These files are required for the behavior to work,
* but they are not executable.
*/
BehaviorMetadata& AddRequiredFile(const gd::String& requiredFile);
/**
* Get the help path of the behavior, relative to the GDevelop documentation
* root.
@@ -239,16 +260,20 @@ class GD_CORE_API BehaviorMetadata {
/**
* \brief Return the associated gd::Behavior, handling behavior contents.
*
* \note Returns a dumb Behavior for events based behaviors as CustomBehavior
* are using EventBasedBehavior.
*/
gd::Behavior& Get() const;
/**
* \brief Return the associated gd::BehaviorsSharedData, handling behavior
* shared data, if any (nullptr if none).
*
* \note Returns nullptr for events based behaviors as they don't declare
* shared data yet.
*/
gd::BehaviorsSharedData* GetSharedDataInstance() const {
return sharedDatasInstance.get();
}
gd::BehaviorsSharedData* GetSharedDataInstance() const;
/**
* \brief Return a reference to a map containing the names of the actions
@@ -271,30 +296,29 @@ class GD_CORE_API BehaviorMetadata {
*/
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() { return strExpressionsInfos; };
#if defined(GD_IDE_ONLY)
std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
std::map<gd::String, gd::InstructionMetadata> actionsInfos;
std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
std::map<gd::String, gd::ExpressionMetadata> strExpressionsInfos;
std::vector<gd::String> includeFiles;
std::vector<gd::String> requiredFiles;
gd::String className;
#endif
private:
gd::String extensionNamespace;
gd::String helpPath;
#if defined(GD_IDE_ONLY)
gd::String fullname;
gd::String defaultName;
gd::String description;
gd::String group;
gd::String iconFilename;
gd::String objectType;
#endif
// TODO: Nitpicking: convert these to std::unique_ptr to clarify ownership.
std::shared_ptr<gd::Behavior> instance;
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance;
bool isEventBased;
};
} // namespace gd

View File

@@ -22,7 +22,6 @@ InstructionMetadata::InstructionMetadata()
canHaveSubInstructions(false),
hidden(true),
usageComplexity(5),
isAsync(false),
isPrivate(false),
isObjectInstruction(false),
isBehaviorInstruction(false) {}
@@ -46,7 +45,6 @@ InstructionMetadata::InstructionMetadata(const gd::String& extensionNamespace_,
extensionNamespace(extensionNamespace_),
hidden(false),
usageComplexity(5),
isAsync(false),
isPrivate(false),
isObjectInstruction(false),
isBehaviorInstruction(false) {}

View File

@@ -6,10 +6,10 @@
#ifndef INSTRUCTIONMETADATA_H
#define INSTRUCTIONMETADATA_H
#include <algorithm>
#include <functional>
#include <map>
#include <memory>
#include <algorithm>
#include "GDCore/Events/Instruction.h"
#include "GDCore/String.h"
@@ -104,16 +104,16 @@ class GD_CORE_API InstructionMetadata {
* background, executing the instructions following it before the frame after
* it resolved.
*/
bool IsAsync() const { return isAsync; }
bool IsAsync() const {
return !codeExtraInformation.asyncFunctionCallName.empty();
}
/**
* Set that the instruction is asynchronous - it will be running in the
* background, executing the instructions following it before the frame after
* it resolved.
* Check if the instruction asynchronicity is optional. If it is, it can either
* be used synchronously or asynchronously, with one function for each.
*/
InstructionMetadata &SetAsync() {
isAsync = true;
return *this;
bool IsOptionallyAsync() const {
return IsAsync() && !codeExtraInformation.functionCallName.empty();
}
/**
@@ -319,14 +319,26 @@ class GD_CORE_API InstructionMetadata {
virtual ~ExtraInformation(){};
/**
* Set the function name which will be used when generating the code.
* \param functionName the name of the function to call
* Set the name of the function which will be called in the generated code.
* \param functionName the name of the function to call.
*/
ExtraInformation &SetFunctionName(const gd::String &functionName_) {
functionCallName = functionName_;
return *this;
}
/**
* Set the name of the function, doing asynchronous work, which will be called in
* the generated code. This function should return an asynchronous task
* (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
*
* \param functionName the name of the function doing asynchronous work to call.
*/
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName_) {
asyncFunctionCallName = functionName_;
return *this;
}
/**
* Declare if the instruction being declared is somewhat manipulating in a
* standard way.
@@ -354,7 +366,7 @@ class GD_CORE_API InstructionMetadata {
* .AddParameter("object", _("Object"), "Text", false)
* .AddParameter("operator", _("Modification operator"), "string")
* .AddParameter("string", _("String"))
* .SetFunctionName("SetString").SetManipulatedType("string").SetGetter("GetString").SetIncludeFile("MyExtension/TextObject.h");
* .SetFunctionName("SetString").SetManipulatedType("string").SetGetter("GetString");
*
* DECLARE_END_OBJECT_ACTION()
* \endcode
@@ -422,6 +434,7 @@ class GD_CORE_API InstructionMetadata {
bool HasCustomCodeGenerator() const { return hasCustomCodeGenerator; }
gd::String functionCallName;
gd::String asyncFunctionCallName;
gd::String type;
AccessType accessType;
gd::String optionalAssociatedInstruction;
@@ -454,15 +467,26 @@ class GD_CORE_API InstructionMetadata {
}
/**
* \brief Set the function that should be called when generating the source
* code from events.
* \param functionName the name of the function to call
* Set the name of the function which will be called in the generated code.
* \param functionName the name of the function to call.
* \note Shortcut for `codeExtraInformation.SetFunctionName`.
*/
ExtraInformation &SetFunctionName(const gd::String &functionName) {
return codeExtraInformation.SetFunctionName(functionName);
}
/**
* Set the name of the function, doing asynchronous work, which will be called in
* the generated code. This function should return an asynchronous task
* (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
*
* \param functionName the name of the function doing asynchronous work to call.
* \note Shortcut for `codeExtraInformation.SetAsyncFunctionName`.
*/
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName) {
return codeExtraInformation.SetAsyncFunctionName(functionName);
}
std::vector<ParameterMetadata> parameters;
private:
@@ -479,7 +503,6 @@ class GD_CORE_API InstructionMetadata {
int usageComplexity; ///< Evaluate the instruction from 0 (simple&easy to
///< use) to 10 (complex to understand)
bool isPrivate;
bool isAsync;
bool isObjectInstruction;
bool isBehaviorInstruction;
gd::String requiredBaseObjectCapability;

View File

@@ -14,6 +14,7 @@
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/Log.h"
namespace gd {
@@ -23,44 +24,55 @@ ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& description_,
const gd::String& icon24x24,
std::shared_ptr<gd::Object> blueprintObject_)
: extensionNamespace(extensionNamespace_),
blueprintObject(blueprintObject_) {
name = name_;
#if defined(GD_IDE_ONLY)
SetFullName(gd::String(fullname_));
SetDescription(gd::String(description_));
iconFilename = icon24x24;
#endif
createFunPtr =
[blueprintObject_](gd::String name) -> std::unique_ptr<gd::Object> {
: ObjectMetadata(extensionNamespace_,
name_,
fullname_,
description_,
icon24x24,
[blueprintObject_](gd::String name) -> std::unique_ptr<gd::Object> {
if (blueprintObject_ == std::shared_ptr<gd::Object>()) {
std::cout
<< "Error: Unable to create object. Have you declared an extension "
"(or ObjectMetadata) without specifying an object as blueprint?"
<< std::endl;
gd::LogFatalError(
"Error: Unable to create object. Have you declared an extension "
"(or ObjectMetadata) without specifying an object as blueprint?");
return nullptr;
}
std::unique_ptr<gd::Object> newObject = blueprintObject_->Clone();
newObject->SetName(name);
return newObject;
};
}) {
blueprintObject = blueprintObject_;
}
ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24)
: ObjectMetadata(extensionNamespace_,
name_,
fullname_,
description_,
icon24x24,
[](gd::String name) -> std::unique_ptr<gd::Object> {
gd::LogFatalError(
"Error: Event-based objects don't have blueprint. "
"This method should not never be called.");
return nullptr;
}) {}
ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24,
CreateFunPtr createFunPtrP)
: extensionNamespace(extensionNamespace_) {
name = name_;
#if defined(GD_IDE_ONLY)
: name(name_),
iconFilename(icon24x24),
createFunPtr(createFunPtrP),
extensionNamespace(extensionNamespace_) {
SetFullName(gd::String(fullname_));
SetDescription(gd::String(description_));
iconFilename = icon24x24;
#endif
createFunPtr = createFunPtrP;
}
gd::InstructionMetadata& ObjectMetadata::AddCondition(

View File

@@ -43,6 +43,16 @@ class GD_CORE_API ObjectMetadata {
const gd::String& description_,
const gd::String& icon24x24_,
std::shared_ptr<gd::Object> blueprintObject_);
/**
* \brief Construct an object metadata, without "blueprint" object
*
* \note This is used by events based objects.
*/
ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24_);
/**
* \brief Construct an object metadata, with a function that will be called
@@ -307,7 +317,9 @@ class GD_CORE_API ObjectMetadata {
std::shared_ptr<gd::Object>
blueprintObject; ///< The "blueprint" object to be copied when a new
///< object is asked. Can be null in case a creation
///< function is passed.
///< function is passed or for events based objects
///< (CustomObject are using EventBasedObject, they
///< don't need blueprints).
};
} // namespace gd

View File

@@ -8,6 +8,7 @@
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/Object.h"
#include "GDCore/String.h"
#include "GDCore/Tools/Log.h"
using namespace std;
@@ -94,11 +95,11 @@ std::shared_ptr<gd::PlatformExtension> Platform::GetExtension(
std::unique_ptr<gd::Object> Platform::CreateObject(
gd::String type, const gd::String& name) const {
if (creationFunctionTable.find(type) == creationFunctionTable.end()) {
std::cout << "Tried to create an object with an unknown type: " << type
<< " for platform " << GetName() << "!" << std::endl;
gd::LogWarning("Tried to create an object with an unknown type: " + type
+ " for platform " + GetName() + "!");
type = "";
if (creationFunctionTable.find("") == creationFunctionTable.end()) {
std::cout << "Unable to create a Base object!" << std::endl;
gd::LogError("Unable to create a Base object!");
return nullptr;
}
}

View File

@@ -244,6 +244,21 @@ gd::ObjectMetadata& PlatformExtension::AddObject(
return objectsInfos[nameWithNamespace];
}
gd::ObjectMetadata& PlatformExtension::AddEventsBasedObject(
const gd::String& name,
const gd::String& fullname,
const gd::String& description,
const gd::String& icon24x24) {
gd::String nameWithNamespace = GetNameSpace() + name;
objectsInfos[nameWithNamespace] = ObjectMetadata(GetNameSpace(),
nameWithNamespace,
fullname,
description,
icon24x24)
.SetHelpPath(GetHelpPath());
return objectsInfos[nameWithNamespace];
}
gd::BehaviorMetadata& PlatformExtension::AddBehavior(
const gd::String& name,
const gd::String& fullname,
@@ -269,6 +284,23 @@ gd::BehaviorMetadata& PlatformExtension::AddBehavior(
return behaviorsInfo[nameWithNamespace];
}
gd::BehaviorMetadata& PlatformExtension::AddEventsBasedBehavior(
const gd::String& name,
const gd::String& fullname,
const gd::String& description,
const gd::String& group,
const gd::String& icon24x24) {
gd::String nameWithNamespace = GetNameSpace() + name;
behaviorsInfo[nameWithNamespace] = BehaviorMetadata(GetNameSpace(),
nameWithNamespace,
fullname,
description,
group,
icon24x24)
.SetHelpPath(GetHelpPath());
return behaviorsInfo[nameWithNamespace];
}
gd::EffectMetadata& PlatformExtension::AddEffect(const gd::String& name) {
gd::String nameWithNamespace = GetNameSpace() + name;
effectsMetadata[nameWithNamespace] = EffectMetadata(nameWithNamespace);

View File

@@ -244,6 +244,20 @@ class GD_CORE_API PlatformExtension {
const gd::String& icon_,
std::shared_ptr<gd::Object> instance);
/**
* \brief Declare a new events based object as being part of the extension.
*
* \param name The name of the object
* \param fullname The user friendly name of the object
* \param description The user friendly description of the object
* \param icon The icon of the object.
*/
gd::ObjectMetadata& AddEventsBasedObject(
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon_);
/**
* \brief Declare a new behavior as being part of the extension.
*
@@ -267,6 +281,21 @@ class GD_CORE_API PlatformExtension {
std::shared_ptr<gd::Behavior> instance,
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
/**
* \brief Declare a new events based behavior as being part of the extension.
*
* \param name The name of the behavior
* \param fullname The user friendly name of the behavior
* \param description The user friendly description of the behavior
* \param icon The icon of the behavior.
*/
gd::BehaviorMetadata& AddEventsBasedBehavior(
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& group_,
const gd::String& icon_);
/**
* \brief Declare a new effect as being part of the extension.
* \param name The internal name of the effect (also called effect type).

View File

@@ -0,0 +1,25 @@
#include "BehaviorTypeRenamer.h"
#include "GDCore/Events/Instruction.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/WholeProjectRefactorer.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
namespace gd {
void BehaviorTypeRenamer::DoVisitObject(gd::Object& object) {
};
void BehaviorTypeRenamer::DoVisitBehavior(gd::Behavior& behavior) {
if (behavior.GetTypeName() == oldType) {
behavior.SetTypeName(newType);
}
};
BehaviorTypeRenamer::~BehaviorTypeRenamer() {}
} // namespace gd

View File

@@ -0,0 +1,43 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_BEHAVIORTYPERENAMER_H
#define GDCORE_BEHAVIORTYPERENAMER_H
#include <set>
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/String.h"
namespace gd {
class Project;
class Object;
class Behavior;
} // namespace gd
namespace gd {
class GD_CORE_API BehaviorTypeRenamer : public ArbitraryObjectsWorker {
public:
BehaviorTypeRenamer(const gd::Project& project_,
const gd::String& oldType_,
const gd::String& newType_)
: project(project_), oldType(oldType_), newType(newType_){};
virtual ~BehaviorTypeRenamer();
private:
void DoVisitObject(gd::Object& object) override;
void DoVisitBehavior(gd::Behavior& behavior) override;
const gd::Project& project;
gd::String oldType;
gd::String newType;
};
}; // namespace gd
#endif // GDCORE_BEHAVIORTYPERENAMER_H

View File

@@ -0,0 +1,24 @@
#include "CustomObjectTypeRenamer.h"
#include "GDCore/Events/Instruction.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/WholeProjectRefactorer.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
namespace gd {
void CustomObjectTypeRenamer::DoVisitObject(gd::Object& object) {
if (object.GetType() == oldType) {
object.SetType(newType);
}
};
void CustomObjectTypeRenamer::DoVisitBehavior(gd::Behavior& behavior) {};
CustomObjectTypeRenamer::~CustomObjectTypeRenamer() {}
} // namespace gd

View File

@@ -0,0 +1,43 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_CUSTOMOBJECTTYPERENAMER_H
#define GDCORE_CUSTOMOBJECTTYPERENAMER_H
#include <set>
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/String.h"
namespace gd {
class Project;
class Object;
class Behavior;
} // namespace gd
namespace gd {
class GD_CORE_API CustomObjectTypeRenamer : public ArbitraryObjectsWorker {
public:
CustomObjectTypeRenamer(const gd::Project& project_,
const gd::String& oldType_,
const gd::String& newType_)
: project(project_), oldType(oldType_), newType(newType_){};
virtual ~CustomObjectTypeRenamer();
private:
void DoVisitObject(gd::Object& object) override;
void DoVisitBehavior(gd::Behavior& behavior) override;
const gd::Project& project;
gd::String oldType;
gd::String newType;
};
}; // namespace gd
#endif // GDCORE_CUSTOMOBJECTTYPERENAMER_H

View File

@@ -0,0 +1,41 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "GDCore/IDE/Events/EventsLeaderboardsLister.h"
#include <map>
#include <memory>
#include <vector>
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/String.h"
namespace gd {
bool EventsLeaderboardsLister::DoVisitInstruction(gd::Instruction& instruction,
bool isCondition) {
const gd::InstructionMetadata& instrInfo =
isCondition ? MetadataProvider::GetConditionMetadata(
project.GetCurrentPlatform(), instruction.GetType())
: MetadataProvider::GetActionMetadata(
project.GetCurrentPlatform(), instruction.GetType());
for (int i = 0; i < instruction.GetParametersCount() &&
i < instrInfo.GetParametersCount();
++i)
if (instrInfo.GetParameter(i).type == "leaderboardId") {
leaderboardIds.insert(instruction.GetParameter(i).GetPlainString());
}
return false;
}
EventsLeaderboardsLister::~EventsLeaderboardsLister() {}
} // namespace gd

View File

@@ -0,0 +1,48 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef EventsLeaderboardsLister_H
#define EventsLeaderboardsLister_H
#include <map>
#include <memory>
#include <set>
#include <vector>
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/String.h"
namespace gd {
class BaseEvent;
class Project;
class EventsList;
}
namespace gd {
/**
* \brief List the leaderboard ids in the instructions.
*
* \ingroup IDE
*/
class GD_CORE_API EventsLeaderboardsLister : public ArbitraryEventsWorker {
public:
EventsLeaderboardsLister(gd::Project& project_) : project(project_){};
virtual ~EventsLeaderboardsLister();
/**
* Return the values of all leaderboardIds found in the events.
*/
const std::set<gd::String>& GetLeaderboardIds() { return leaderboardIds; }
private:
virtual bool DoVisitInstruction(gd::Instruction& instruction,
bool isCondition);
std::set<gd::String> leaderboardIds;
gd::Project& project;
};
} // namespace gd
#endif // EventsLeaderboardsLister_H

View File

@@ -0,0 +1,49 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "GDCore/IDE/Events/EventsLeaderboardsRenamer.h"
#include <map>
#include <memory>
#include <vector>
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/String.h"
namespace gd {
bool EventsLeaderboardsRenamer::DoVisitInstruction(gd::Instruction& instruction,
bool isCondition) {
const gd::InstructionMetadata& instrInfo =
isCondition ? MetadataProvider::GetConditionMetadata(
project.GetCurrentPlatform(), instruction.GetType())
: MetadataProvider::GetActionMetadata(
project.GetCurrentPlatform(), instruction.GetType());
for (int i = 0; i < instruction.GetParametersCount() &&
i < instrInfo.GetParametersCount();
++i) {
const gd::ParameterMetadata parameter = instrInfo.GetParameter(i);
if (parameter.type == "leaderboardId") {
const gd::String leaderboardId =
instruction.GetParameter(i).GetPlainString();
if (leaderboardIdMap.find(leaderboardId) != leaderboardIdMap.end()) {
instruction.SetParameter(i, leaderboardIdMap[leaderboardId]);
}
}
}
return false;
}
EventsLeaderboardsRenamer::~EventsLeaderboardsRenamer() {}
} // namespace gd

View File

@@ -0,0 +1,46 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef EventsLeaderboardsRenamer_H
#define EventsLeaderboardsRenamer_H
#include <map>
#include <memory>
#include <set>
#include <vector>
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/String.h"
namespace gd {
class BaseEvent;
class Project;
class EventsList;
}
namespace gd {
/**
* \brief Replace the leaderboard ids in the instructions.
*
* \ingroup IDE
*/
class GD_CORE_API EventsLeaderboardsRenamer : public ArbitraryEventsWorker {
public:
EventsLeaderboardsRenamer(
gd::Project& project_,
const std::map<gd::String, gd::String>& leaderboardIdMap_)
: project(project_), leaderboardIdMap(leaderboardIdMap_){};
virtual ~EventsLeaderboardsRenamer();
private:
virtual bool DoVisitInstruction(gd::Instruction& instruction,
bool isCondition);
std::map<gd::String, gd::String> leaderboardIdMap;
gd::Project& project;
};
} // namespace gd
#endif // EventsLeaderboardsRenamer_H

View File

@@ -19,6 +19,7 @@
#include "GDCore/IDE/Events/ExpressionValidator.h"
#include "GDCore/IDE/Events/InstructionSentenceFormatter.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/EventsBasedObject.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
using namespace std;
@@ -121,7 +122,7 @@ class GD_CORE_API ExpressionObjectRenamer : public ExpressionParser2NodeWorker {
bool hasDoneRenaming;
const gd::String& objectName;
const gd::String& objectNewName;
const gd::Platform &platform;
const gd::ObjectsContainer &globalObjectsContainer;
const gd::ObjectsContainer &objectsContainer;
@@ -216,7 +217,7 @@ class GD_CORE_API ExpressionObjectFinder : public ExpressionParser2NodeWorker {
private:
bool hasObject;
const gd::String& objectName;
const gd::Platform &platform;
const gd::ObjectsContainer &globalObjectsContainer;
const gd::ObjectsContainer &objectsContainer;
@@ -411,8 +412,8 @@ void EventsRefactorer::RenameObjectInEvents(const gd::Platform& platform,
}
bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
gd::InstructionsList& actions,
gd::String name) {
bool somethingModified = false;
@@ -434,7 +435,7 @@ bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
"number", instrInfos.parameters[pNb].type)) {
auto node = actions[aId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "number", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "number", *node, name)) {
deleteMe = true;
break;
}
@@ -444,7 +445,7 @@ bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
"string", instrInfos.parameters[pNb].type)) {
auto node = actions[aId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "string", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "string", *node, name)) {
deleteMe = true;
break;
}
@@ -458,8 +459,8 @@ bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
} else if (!actions[aId].GetSubInstructions().empty())
somethingModified =
RemoveObjectInActions(platform,
project,
layout,
globalObjectsContainer,
objectsContainer,
actions[aId].GetSubInstructions(),
name) ||
somethingModified;
@@ -470,8 +471,8 @@ bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
bool EventsRefactorer::RemoveObjectInConditions(
const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
gd::InstructionsList& conditions,
gd::String name) {
bool somethingModified = false;
@@ -494,7 +495,7 @@ bool EventsRefactorer::RemoveObjectInConditions(
"number", instrInfos.parameters[pNb].type)) {
auto node = conditions[cId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "number", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "number", *node, name)) {
deleteMe = true;
break;
}
@@ -504,7 +505,7 @@ bool EventsRefactorer::RemoveObjectInConditions(
"string", instrInfos.parameters[pNb].type)) {
auto node = conditions[cId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "string", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "string", *node, name)) {
deleteMe = true;
break;
}
@@ -518,8 +519,8 @@ bool EventsRefactorer::RemoveObjectInConditions(
} else if (!conditions[cId].GetSubInstructions().empty())
somethingModified =
RemoveObjectInConditions(platform,
project,
layout,
globalObjectsContainer,
objectsContainer,
conditions[cId].GetSubInstructions(),
name) ||
somethingModified;
@@ -529,8 +530,8 @@ bool EventsRefactorer::RemoveObjectInConditions(
}
void EventsRefactorer::RemoveObjectInEvents(const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
gd::EventsList& events,
gd::String name) {
for (std::size_t i = 0; i < events.size(); ++i) {
@@ -538,19 +539,19 @@ void EventsRefactorer::RemoveObjectInEvents(const gd::Platform& platform,
events[i].GetAllConditionsVectors();
for (std::size_t j = 0; j < conditionsVectors.size(); ++j) {
bool conditionsModified = RemoveObjectInConditions(
platform, project, layout, *conditionsVectors[j], name);
platform, globalObjectsContainer, objectsContainer, *conditionsVectors[j], name);
}
vector<gd::InstructionsList*> actionsVectors =
events[i].GetAllActionsVectors();
for (std::size_t j = 0; j < actionsVectors.size(); ++j) {
bool actionsModified = RemoveObjectInActions(
platform, project, layout, *actionsVectors[j], name);
platform, globalObjectsContainer, objectsContainer, *actionsVectors[j], name);
}
if (events[i].CanHaveSubEvents())
RemoveObjectInEvents(
platform, project, layout, events[i].GetSubEvents(), name);
platform, globalObjectsContainer, objectsContainer, events[i].GetSubEvents(), name);
}
}
@@ -565,6 +566,8 @@ std::vector<EventsSearchResult> EventsRefactorer::ReplaceStringInEvents(
bool inActions,
bool inEventStrings) {
vector<EventsSearchResult> modifiedEvents;
if (toReplace.empty()) return modifiedEvents;
for (std::size_t i = 0; i < events.size(); ++i) {
bool eventModified = false;
if (inConditions) {

View File

@@ -78,13 +78,16 @@ class GD_CORE_API ExpressionParameterMover
void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode& node) override {}
void OnVisitFunctionCallNode(FunctionCallNode& node) override {
auto moveParameter =
[this](std::vector<std::unique_ptr<gd::ExpressionNode>>& parameters) {
if (oldIndex >= parameters.size() || newIndex >= parameters.size())
[this](std::vector<std::unique_ptr<gd::ExpressionNode>>& parameters, int firstWrittenParameterIndex) {
size_t newExpressionIndex = newIndex - firstWrittenParameterIndex;
size_t oldExpressionIndex = oldIndex - firstWrittenParameterIndex;
if (oldExpressionIndex >= parameters.size() || newExpressionIndex >= parameters.size())
return;
auto movedParameterNode = std::move(parameters[oldIndex]);
parameters.erase(parameters.begin() + oldIndex);
parameters.insert(parameters.begin() + newIndex,
auto movedParameterNode = std::move(parameters[oldExpressionIndex]);
parameters.erase(parameters.begin() + oldExpressionIndex);
parameters.insert(parameters.begin() + newExpressionIndex,
std::move(movedParameterNode));
};
@@ -92,10 +95,13 @@ class GD_CORE_API ExpressionParameterMover
if (behaviorType.empty() && !objectType.empty() &&
!node.objectName.empty()) {
// Move parameter of an object function
// This refactor only applies on events object functions
// and events object functions doesn't exist yet.
// This is a dead code.
const gd::String& thisObjectType = gd::GetTypeOfObject(
globalObjectsContainer, objectsContainer, node.objectName);
if (thisObjectType == objectType) {
moveParameter(node.parameters);
moveParameter(node.parameters, 1);
hasDoneMoving = true;
}
} else if (!behaviorType.empty() && !node.behaviorName.empty()) {
@@ -103,12 +109,12 @@ class GD_CORE_API ExpressionParameterMover
const gd::String& thisBehaviorType = gd::GetTypeOfBehavior(
globalObjectsContainer, objectsContainer, node.behaviorName);
if (thisBehaviorType == behaviorType) {
moveParameter(node.parameters);
moveParameter(node.parameters, 2);
hasDoneMoving = true;
}
} else if (behaviorType.empty() && objectType.empty()) {
// Move parameter of a free function
moveParameter(node.parameters);
moveParameter(node.parameters, 1);
hasDoneMoving = true;
}
}

View File

@@ -5,7 +5,7 @@
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/WholeProjectRefactorer.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
#include "GDCore/Project/BehaviorContent.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
@@ -29,7 +29,7 @@ void UsedExtensionsFinder::DoVisitObject(gd::Object& object) {
// Behaviors scanner
void UsedExtensionsFinder::DoVisitBehavior(gd::BehaviorContent& behavior) {
void UsedExtensionsFinder::DoVisitBehavior(gd::Behavior& behavior) {
usedExtensions.insert(
gd::MetadataProvider::GetExtensionAndBehaviorMetadata(
project.GetCurrentPlatform(), behavior.GetTypeName())

View File

@@ -16,7 +16,7 @@
namespace gd {
class Project;
class Object;
class BehaviorContent;
class Behavior;
} // namespace gd
namespace gd {
@@ -38,7 +38,7 @@ class GD_CORE_API UsedExtensionsFinder
void DoVisitObject(gd::Object& object) override;
// Behavior Visitor
void DoVisitBehavior(gd::BehaviorContent& behavior) override;
void DoVisitBehavior(gd::Behavior& behavior) override;
// Instructions Visitor
bool DoVisitInstruction(gd::Instruction& instruction,

View File

@@ -8,9 +8,10 @@
#include "GDCore/Events/Expression.h"
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
#include "GDCore/Project/EventsBasedBehavior.h"
#include "GDCore/Project/EventsBasedObject.h"
//#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/EventsFunction.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/Project.h"
#include "GDCore/String.h"
#include "GDCore/Tools/Log.h"
@@ -72,4 +73,39 @@ void EventsFunctionTools::BehaviorEventsFunctionToObjectsContainer(
}
}
void EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
const gd::Project& project,
const gd::EventsBasedObject& eventsBasedObject,
const gd::EventsFunction& eventsFunction,
gd::ObjectsContainer& outputGlobalObjectsContainer,
gd::ObjectsContainer& outputObjectsContainer) {
// The context is build the same way as free function...
FreeEventsFunctionToObjectsContainer(project,
eventsFunction,
outputGlobalObjectsContainer,
outputObjectsContainer);
// TODO EBO Use a constant instead a hard coded value "Object".
// ...and has an "Object" by convention...
if (!outputObjectsContainer.HasObjectNamed("Object")) {
gd::LogWarning("No \"Object\" in a function of an events based object: " +
eventsFunction.GetName() +
". This means this function is likely misconfigured (check "
"its parameters).");
return;
}
if (eventsBasedObject.HasObjectNamed("Object")) {
gd::LogWarning("Child-objects can't be named Object because it's reserved"
"for the parent. ");
return;
}
// ...and its children.
auto &children = eventsBasedObject.GetObjects();
for (auto &childObject : children) {
auto child = childObject.get();
outputObjectsContainer.InsertObject(*child, children.size());
}
}
} // namespace gd

View File

@@ -14,6 +14,7 @@ class ObjectsContainer;
class ParameterMetadata;
class EventsFunction;
class EventsBasedBehavior;
class EventsBasedObject;
class Expression;
} // namespace gd
@@ -51,6 +52,21 @@ class GD_CORE_API EventsFunctionTools {
const gd::EventsFunction& eventsFunction,
gd::ObjectsContainer& outputGlobalObjectsContainer,
gd::ObjectsContainer& outputObjectsContainer);
/**
* \brief Given a parent-object events function, initialize the given objects container
* with objects described in the events function parameters, in
* the events function groups and in the parent-object properties for
* child-objects.
*
* This is useful to create the "context" of a function, before code
* generation for example.
*/
static void ObjectEventsFunctionToObjectsContainer(
const gd::Project& project,
const gd::EventsBasedObject& eventsBasedObject,
const gd::EventsFunction& eventsFunction,
gd::ObjectsContainer& outputGlobalObjectsContainer,
gd::ObjectsContainer& outputObjectsContainer);
};
} // namespace gd

View File

@@ -10,7 +10,7 @@
#include <memory>
#include <vector>
#include "GDCore/Project/BehaviorContent.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/String.h"
@@ -36,7 +36,7 @@ void ArbitraryObjectsWorker::VisitObject(gd::Object& object) {
VisitBehavior(object.GetBehavior(behaviorName));
}
void ArbitraryObjectsWorker::VisitBehavior(gd::BehaviorContent& behavior) {
void ArbitraryObjectsWorker::VisitBehavior(gd::Behavior& behavior) {
DoVisitBehavior(behavior);
}

View File

@@ -15,7 +15,7 @@
namespace gd {
class Object;
class ObjectsContainer;
class BehaviorContent;
class Behavior;
} // namespace gd
namespace gd {
@@ -40,7 +40,7 @@ class GD_CORE_API ArbitraryObjectsWorker {
private:
void VisitObjectContainer(gd::ObjectsContainer& objects);
void VisitObject(gd::Object& object);
void VisitBehavior(gd::BehaviorContent& instruction);
void VisitBehavior(gd::Behavior& behavior);
/**
* Called to do some work on an object container.
@@ -55,7 +55,7 @@ class GD_CORE_API ArbitraryObjectsWorker {
/**
* Called to do some work on a behavior.
*/
virtual void DoVisitBehavior(gd::BehaviorContent& instruction){};
virtual void DoVisitBehavior(gd::Behavior& behavior){};
};
} // namespace gd

View File

@@ -111,7 +111,7 @@ class ResourceWorkerInEventsWorker : public ArbitraryEventsWorker {
ResourceWorkerInEventsWorker(const gd::Project& project_,
gd::ArbitraryResourceWorker& worker_)
: project(project_), worker(worker_){};
virtual ~ResourceWorkerInEventsWorker() {};
virtual ~ResourceWorkerInEventsWorker(){};
private:
bool DoVisitInstruction(gd::Instruction& instruction, bool isCondition) {
@@ -131,7 +131,8 @@ class ResourceWorkerInEventsWorker : public ArbitraryEventsWorker {
const gd::String& lastObjectName) {
const String& parameterValue = parameterExpression.GetPlainString();
if (parameterMetadata.GetType() ==
"police") { // Should be renamed fontResource
"police" || // Should be renamed fontResource
parameterMetadata.GetType() == "fontResource") {
gd::String updatedParameterValue = parameterValue;
worker.ExposeFont(updatedParameterValue);
instruction.SetParameter(parameterIndex, updatedParameterValue);
@@ -149,6 +150,10 @@ class ResourceWorkerInEventsWorker : public ArbitraryEventsWorker {
gd::String updatedParameterValue = parameterValue;
worker.ExposeImage(updatedParameterValue);
instruction.SetParameter(parameterIndex, updatedParameterValue);
} else if (parameterMetadata.GetType() == "jsonResource") {
gd::String updatedParameterValue = parameterValue;
worker.ExposeJson(updatedParameterValue);
instruction.SetParameter(parameterIndex, updatedParameterValue);
}
});

View File

@@ -11,7 +11,7 @@
namespace gd {
class Project;
class Object;
class BehaviorContent;
class Behavior;
} // namespace gd
namespace gd {
@@ -24,12 +24,12 @@ class GD_CORE_API UnfilledRequiredBehaviorPropertyProblem {
UnfilledRequiredBehaviorPropertyProblem(
const gd::Project& sourceProject_,
gd::Object& sourceObject_,
gd::BehaviorContent& sourceBehaviorContent_,
gd::Behavior& sourceBehavior_,
const gd::String& sourcePropertyName_,
const gd::String& expectedBehaviorTypeName_)
: sourceProject(sourceProject_),
sourceObject(sourceObject_),
sourceBehaviorContent(sourceBehaviorContent_),
sourceBehavior(sourceBehavior_),
sourcePropertyName(sourcePropertyName_),
expectedBehaviorTypeName(expectedBehaviorTypeName_){};
virtual ~UnfilledRequiredBehaviorPropertyProblem();
@@ -47,8 +47,8 @@ class GD_CORE_API UnfilledRequiredBehaviorPropertyProblem {
/**
* \brief Return the behavior where the problem appears.
*/
virtual gd::BehaviorContent& GetSourceBehaviorContent() const {
return sourceBehaviorContent;
virtual gd::Behavior& GetSourceBehaviorContent() const {
return sourceBehavior;
}
/**
@@ -69,7 +69,7 @@ class GD_CORE_API UnfilledRequiredBehaviorPropertyProblem {
private:
const gd::Project& sourceProject;
gd::Object& sourceObject;
gd::BehaviorContent& sourceBehaviorContent;
gd::Behavior& sourceBehavior;
const gd::String sourcePropertyName;
const gd::String expectedBehaviorTypeName;

View File

@@ -11,6 +11,8 @@
#include "GDCore/IDE/DependenciesAnalyzer.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/IDE/Events/EventsBehaviorRenamer.h"
#include "GDCore/IDE/Events/CustomObjectTypeRenamer.h"
#include "GDCore/IDE/Events/BehaviorTypeRenamer.h"
#include "GDCore/IDE/Events/EventsRefactorer.h"
#include "GDCore/IDE/Events/ExpressionsParameterMover.h"
#include "GDCore/IDE/Events/ExpressionsRenamer.h"
@@ -20,8 +22,9 @@
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/IDE/UnfilledRequiredBehaviorPropertyProblem.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/BehaviorContent.h"
#include "GDCore/Project/BehaviorConfigurationContainer.h"
#include "GDCore/Project/EventsBasedBehavior.h"
#include "GDCore/Project/EventsBasedObject.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/ExternalLayout.h"
@@ -53,6 +56,17 @@ gd::String GetBehaviorFullType(const gd::String& extensionName,
const auto& separator = gd::PlatformExtension::GetNamespaceSeparator();
return extensionName + separator + behaviorName;
}
gd::String GetObjectEventsFunctionFullType(const gd::String& extensionName,
const gd::String& objectName,
const gd::String& functionName) {
const auto& separator = gd::PlatformExtension::GetNamespaceSeparator();
return extensionName + separator + objectName + separator + functionName;
}
gd::String GetObjectFullType(const gd::String& extensionName,
const gd::String& objectName) {
const auto& separator = gd::PlatformExtension::GetNamespaceSeparator();
return extensionName + separator + objectName;
}
} // namespace
namespace gd {
@@ -60,6 +74,9 @@ namespace gd {
// By convention, the first parameter of an events based behavior method is
// always called "Object".
const gd::String WholeProjectRefactorer::behaviorObjectParameterName = "Object";
// By convention, the first parameter of an events based object method is
// always called "Object".
const gd::String WholeProjectRefactorer::parentObjectParameterName = "Object";
void WholeProjectRefactorer::ExposeProjectEvents(
gd::Project& project, gd::ArbitraryEventsWorker& worker) {
@@ -93,6 +110,17 @@ void WholeProjectRefactorer::ExposeProjectEvents(
worker.Launch(eventsFunction->GetEvents());
}
}
// Add (object) events functions
for (auto&& eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects()
.GetInternalVector()) {
auto& objectEventsFunctions = eventsBasedObject->GetEventsFunctions();
for (auto&& eventsFunction :
objectEventsFunctions.GetInternalVector()) {
worker.Launch(eventsFunction->GetEvents());
}
}
}
}
@@ -139,6 +167,13 @@ void WholeProjectRefactorer::ExposeProjectEvents(
.GetInternalVector()) {
ExposeEventsBasedBehaviorEvents(project, *eventsBasedBehavior, worker);
}
// Add (object) events functions
for (auto&& eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects()
.GetInternalVector()) {
ExposeEventsBasedObjectEvents(project, *eventsBasedObject, worker);
}
}
}
@@ -162,11 +197,49 @@ void WholeProjectRefactorer::ExposeEventsBasedBehaviorEvents(
}
}
void WholeProjectRefactorer::ExposeEventsBasedObjectEvents(
gd::Project& project,
const gd::EventsBasedObject& eventsBasedObject,
gd::ArbitraryEventsWorkerWithContext& worker) {
auto& objectEventsFunctions = eventsBasedObject.GetEventsFunctions();
for (auto&& eventsFunction : objectEventsFunctions.GetInternalVector()) {
gd::ObjectsContainer globalObjectsAndGroups;
gd::ObjectsContainer objectsAndGroups;
gd::EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
project,
eventsBasedObject,
*eventsFunction,
globalObjectsAndGroups,
objectsAndGroups);
worker.Launch(
eventsFunction->GetEvents(), globalObjectsAndGroups, objectsAndGroups);
}
}
void WholeProjectRefactorer::ExposeProjectObjects(
gd::Project& project, gd::ArbitraryObjectsWorker& worker) {
// Global objects
worker.Launch(project);
for (size_t i = 0; i < project.GetLayoutsCount(); i++)
// Layers objects
for (size_t i = 0; i < project.GetLayoutsCount(); i++) {
worker.Launch(project.GetLayout(i));
}
// Event based objects children
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
e++) {
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
for (auto&& eventsBasedObjectUniquePtr :
eventsFunctionsExtension.GetEventsBasedObjects()
.GetInternalVector()) {
auto eventsBasedObject = eventsBasedObjectUniquePtr.get();
worker.Launch(*eventsBasedObject);
}
}
};
std::set<gd::String>
@@ -181,8 +254,8 @@ WholeProjectRefactorer::GetAllObjectTypesUsingEventsBasedBehavior(
auto addTypesOfObjectsIn =
[&allTypes, &behaviorType](const gd::ObjectsContainer& objectsContainer) {
for (auto& object : objectsContainer.GetObjects()) {
for (auto& behaviorContent : object->GetAllBehaviorContents()) {
if (behaviorContent.second->GetTypeName() == behaviorType) {
for (auto& behavior : object->GetAllBehaviorContents()) {
if (behavior.second->GetTypeName() == behaviorType) {
allTypes.insert(object->GetType());
}
}
@@ -223,6 +296,26 @@ void WholeProjectRefactorer::EnsureBehaviorEventsFunctionsProperParameters(
}
}
void WholeProjectRefactorer::EnsureObjectEventsFunctionsProperParameters(
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject) {
for (auto& eventsFunction :
eventsBasedObject.GetEventsFunctions().GetInternalVector()) {
auto& parameters = eventsFunction->GetParameters();
while (parameters.size() < 1) {
gd::ParameterMetadata newParameter;
parameters.push_back(newParameter);
}
parameters[0]
.SetType("object")
.SetName(parentObjectParameterName)
.SetDescription("Object")
.SetExtraInfo(GetObjectFullType(eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName()));
}
}
void WholeProjectRefactorer::RenameEventsFunctionsExtension(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
@@ -297,6 +390,66 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
// extension name
};
auto renameObjectEventsFunction =
[&project, &oldName, &newName](
const gd::EventsBasedObject& eventsBasedObject,
const gd::EventsFunction& eventsFunction) {
if (eventsFunction.GetFunctionType() == gd::EventsFunction::Action ||
eventsFunction.GetFunctionType() == gd::EventsFunction::Condition) {
gd::InstructionsTypeRenamer renamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(oldName,
eventsBasedObject.GetName(),
eventsFunction.GetName()),
GetObjectEventsFunctionFullType(newName,
eventsBasedObject.GetName(),
eventsFunction.GetName()));
ExposeProjectEvents(project, renamer);
} else if (eventsFunction.GetFunctionType() ==
gd::EventsFunction::Expression ||
eventsFunction.GetFunctionType() ==
gd::EventsFunction::StringExpression) {
// Nothing to do, expressions are not including the extension name
}
};
auto renameObjectPropertyFunctions =
[&project, &oldName, &newName](
const gd::EventsBasedObject& eventsBasedObject,
const gd::NamedPropertyDescriptor& property) {
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(
oldName,
eventsBasedObject.GetName(),
gd::EventsBasedObject::GetPropertyActionName(
property.GetName())),
GetObjectEventsFunctionFullType(
newName,
eventsBasedObject.GetName(),
gd::EventsBasedObject::GetPropertyActionName(
property.GetName())));
ExposeProjectEvents(project, actionRenamer);
gd::InstructionsTypeRenamer conditionRenamer =
gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(
oldName,
eventsBasedObject.GetName(),
gd::EventsBasedObject::GetPropertyConditionName(
property.GetName())),
GetObjectEventsFunctionFullType(
newName,
eventsBasedObject.GetName(),
gd::EventsBasedObject::GetPropertyConditionName(
property.GetName())));
ExposeProjectEvents(project, conditionRenamer);
// Nothing to do for expressions, expressions are not including the
// extension name
};
// Order is important: we first rename the expressions then the instructions,
// to avoid being unable to fetch the metadata (the types of parameters) of
// instructions after they are renamed.
@@ -352,6 +505,28 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
}
}
// Object instructions
for (auto&& eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
auto& objectEventsFunctions = eventsBasedObject->GetEventsFunctions();
for (auto&& eventsFunction : objectEventsFunctions.GetInternalVector()) {
if (eventsFunction->GetFunctionType() == gd::EventsFunction::Action ||
eventsFunction->GetFunctionType() == gd::EventsFunction::Condition) {
renameObjectEventsFunction(*eventsBasedObject, *eventsFunction);
}
}
}
// Object properties
for (auto&& eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
auto& objectProperties = eventsBasedObject->GetPropertyDescriptors();
for (auto&& propertyDescriptor : objectProperties.GetInternalVector()) {
renameObjectPropertyFunctions(*eventsBasedObject,
*propertyDescriptor);
}
}
// Finally, rename behaviors used in objects
for (auto&& eventsBasedBehavior :
eventsFunctionsExtension.GetEventsBasedBehaviors().GetInternalVector()) {
@@ -360,6 +535,15 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
GetBehaviorFullType(oldName, eventsBasedBehavior->GetName()),
GetBehaviorFullType(newName, eventsBasedBehavior->GetName()));
}
// Finally, rename custom objects type
for (auto&& eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
DoRenameObject(
project,
GetObjectFullType(oldName, eventsBasedObject->GetName()),
GetObjectFullType(newName, eventsBasedObject->GetName()));
}
}
void WholeProjectRefactorer::RenameEventsFunction(
@@ -419,6 +603,44 @@ void WholeProjectRefactorer::RenameBehaviorEventsFunction(
}
}
void WholeProjectRefactorer::RenameObjectEventsFunction(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject,
const gd::String& oldFunctionName,
const gd::String& newFunctionName) {
auto& eventsFunctions = eventsBasedObject.GetEventsFunctions();
if (!eventsFunctions.HasEventsFunctionNamed(oldFunctionName)) return;
const gd::EventsFunction& eventsFunction =
eventsFunctions.GetEventsFunction(oldFunctionName);
if (eventsFunction.GetFunctionType() == gd::EventsFunction::Action ||
eventsFunction.GetFunctionType() == gd::EventsFunction::Condition) {
gd::InstructionsTypeRenamer renamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName(),
oldFunctionName),
GetObjectEventsFunctionFullType(eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName(),
newFunctionName));
ExposeProjectEvents(project, renamer);
} else if (eventsFunction.GetFunctionType() ==
gd::EventsFunction::Expression ||
eventsFunction.GetFunctionType() ==
gd::EventsFunction::StringExpression) {
gd::ExpressionsRenamer renamer =
gd::ExpressionsRenamer(project.GetCurrentPlatform());
renamer.SetReplacedObjectExpression(
GetObjectFullType(eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName()),
oldFunctionName,
newFunctionName);
ExposeProjectEvents(project, renamer);
}
}
void WholeProjectRefactorer::MoveEventsFunctionParameter(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
@@ -489,6 +711,45 @@ void WholeProjectRefactorer::MoveBehaviorEventsFunctionParameter(
}
}
void WholeProjectRefactorer::MoveObjectEventsFunctionParameter(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject,
const gd::String& functionName,
std::size_t oldIndex,
std::size_t newIndex) {
auto& eventsFunctions = eventsBasedObject.GetEventsFunctions();
if (!eventsFunctions.HasEventsFunctionNamed(functionName)) return;
const gd::EventsFunction& eventsFunction =
eventsFunctions.GetEventsFunction(functionName);
const gd::String& eventsFunctionType =
GetObjectEventsFunctionFullType(eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName(),
functionName);
if (eventsFunction.GetFunctionType() == gd::EventsFunction::Action ||
eventsFunction.GetFunctionType() == gd::EventsFunction::Condition) {
gd::InstructionsParameterMover mover = gd::InstructionsParameterMover(
project, eventsFunctionType, oldIndex, newIndex);
ExposeProjectEvents(project, mover);
} else if (eventsFunction.GetFunctionType() ==
gd::EventsFunction::Expression ||
eventsFunction.GetFunctionType() ==
gd::EventsFunction::StringExpression) {
gd::ExpressionsParameterMover mover =
gd::ExpressionsParameterMover(project.GetCurrentPlatform());
mover.SetObjectExpressionMovedParameter(
GetObjectFullType(eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName()),
functionName,
oldIndex,
newIndex);
ExposeProjectEvents(project, mover);
}
}
void WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
@@ -555,6 +816,55 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
}
}
void WholeProjectRefactorer::RenameEventsBasedObjectProperty(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject,
const gd::String& oldPropertyName,
const gd::String& newPropertyName) {
auto& properties = eventsBasedObject.GetPropertyDescriptors();
if (!properties.Has(oldPropertyName)) return;
// Properties that represent primitive values will be used through
// their related actions/conditions/expressions. Rename these.
// Order is important: we first rename the expressions then the
// instructions, to avoid being unable to fetch the metadata (the types of
// parameters) of instructions after they are renamed.
gd::ExpressionsRenamer expressionRenamer =
gd::ExpressionsRenamer(project.GetCurrentPlatform());
expressionRenamer.SetReplacedObjectExpression(
GetObjectFullType(eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName()),
EventsBasedObject::GetPropertyExpressionName(oldPropertyName),
EventsBasedObject::GetPropertyExpressionName(newPropertyName));
ExposeProjectEvents(project, expressionRenamer);
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName(),
EventsBasedObject::GetPropertyActionName(oldPropertyName)),
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName(),
EventsBasedObject::GetPropertyActionName(newPropertyName)));
ExposeProjectEvents(project, actionRenamer);
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName(),
EventsBasedObject::GetPropertyConditionName(oldPropertyName)),
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
eventsBasedObject.GetName(),
EventsBasedObject::GetPropertyConditionName(newPropertyName)));
ExposeProjectEvents(project, conditionRenamer);
}
void WholeProjectRefactorer::AddBehaviorAndRequiredBehaviors(
gd::Project& project,
gd::Object& object,
@@ -575,10 +885,8 @@ void WholeProjectRefactorer::AddBehaviorAndRequiredBehaviors(
return;
}
gd::Behavior& behavior = behaviorMetadata.Get();
gd::BehaviorContent& behaviorContent = object.GetBehavior(behaviorName);
for (auto const& keyValue :
behavior.GetProperties(behaviorContent.GetContent())) {
gd::Behavior& behavior = object.GetBehavior(behaviorName);
for (auto const& keyValue : behavior.GetProperties()) {
const gd::String& propertyName = keyValue.first;
const gd::PropertyDescriptor& property = keyValue.second;
if (property.GetType().LowerCase() == "behavior") {
@@ -588,11 +896,11 @@ void WholeProjectRefactorer::AddBehaviorAndRequiredBehaviors(
continue;
}
const gd::String& requiredBehaviorType = extraInfo.at(0);
const auto behaviorContents =
const auto behaviorNames =
WholeProjectRefactorer::GetBehaviorsWithType(object,
requiredBehaviorType);
const gd::String* defaultBehaviorName = nullptr;
if (behaviorContents.size() == 0) {
if (behaviorNames.size() == 0) {
const gd::BehaviorMetadata& requiredBehaviorMetadata =
MetadataProvider::GetBehaviorMetadata(platform,
requiredBehaviorType);
@@ -602,10 +910,9 @@ void WholeProjectRefactorer::AddBehaviorAndRequiredBehaviors(
project, object, requiredBehaviorType, requiredBehaviorName);
defaultBehaviorName = &requiredBehaviorName;
} else {
defaultBehaviorName = &behaviorContents.at(0);
defaultBehaviorName = &behaviorNames.at(0);
}
behavior.UpdateProperty(
behaviorContent.GetContent(), propertyName, *defaultBehaviorName);
behavior.UpdateProperty(propertyName, *defaultBehaviorName);
}
}
}
@@ -614,9 +921,8 @@ std::vector<gd::String> WholeProjectRefactorer::GetBehaviorsWithType(
const gd::Object& object, const gd::String& type) {
std::vector<gd::String> behaviors;
for (auto& behaviorName : object.GetAllBehaviorNames()) {
const gd::BehaviorContent& behaviorContent =
object.GetBehavior(behaviorName);
if (behaviorContent.GetTypeName() == type) {
const gd::Behavior& behavior = object.GetBehavior(behaviorName);
if (behavior.GetTypeName() == type) {
behaviors.push_back(behaviorName);
}
}
@@ -644,18 +950,15 @@ void WholeProjectRefactorer::FindDependentBehaviorNames(
std::unordered_set<gd::String>& dependentBehaviorNames) {
const gd::Platform& platform = project.GetCurrentPlatform();
for (auto const& objectBehaviorName : object.GetAllBehaviorNames()) {
const gd::BehaviorContent& behaviorContent =
object.GetBehavior(objectBehaviorName);
const gd::Behavior& behavior = object.GetBehavior(objectBehaviorName);
const auto& behaviorMetadata = MetadataProvider::GetBehaviorMetadata(
platform, behaviorContent.GetTypeName());
platform, behavior.GetTypeName());
if (MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
// Ignore this behavior as it's unknown.
continue;
}
gd::Behavior& behavior = behaviorMetadata.Get();
for (auto const& keyValue :
behavior.GetProperties(behaviorContent.GetContent())) {
for (auto const& keyValue : behavior.GetProperties()) {
const gd::String& propertyName = keyValue.first;
const gd::PropertyDescriptor& property = keyValue.second;
if (property.GetType().LowerCase() == "behavior" &&
@@ -679,25 +982,11 @@ WholeProjectRefactorer::FindInvalidRequiredBehaviorProperties(
[&project, &invalidRequiredBehaviorProperties](
const std::vector<std::unique_ptr<gd::Object> >& objectsList) {
for (auto& object : objectsList) {
for (auto& behaviorContentKeyValuePair :
for (auto& behaviorKeyValuePair :
object->GetAllBehaviorContents()) {
gd::BehaviorContent& behaviorContent =
*behaviorContentKeyValuePair.second;
gd::Behavior& behavior = *behaviorKeyValuePair.second;
const auto& behaviorMetadata =
gd::MetadataProvider::GetBehaviorMetadata(
project.GetCurrentPlatform(),
behaviorContent.GetTypeName());
if (MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
std::cout << "Could not find metadata for behavior with type \""
<< behaviorContent.GetTypeName() << "\"" << std::endl;
continue;
}
const auto& behavior = behaviorMetadata.Get();
for (auto const& keyValue :
behavior.GetProperties(behaviorContent.GetContent())) {
for (auto const& keyValue : behavior.GetProperties()) {
const gd::String& propertyName = keyValue.first;
const gd::PropertyDescriptor& property = keyValue.second;
if (property.GetType().LowerCase() != "behavior") {
@@ -719,7 +1008,7 @@ WholeProjectRefactorer::FindInvalidRequiredBehaviorProperties(
auto problem = UnfilledRequiredBehaviorPropertyProblem(
project,
*object,
behaviorContent,
behavior,
propertyName,
requiredBehaviorType);
invalidRequiredBehaviorProperties.push_back(problem);
@@ -748,21 +1037,15 @@ bool WholeProjectRefactorer::FixInvalidRequiredBehaviorProperties(
auto& object = problem.GetSourceObject();
auto suggestedBehaviorNames =
GetBehaviorsWithType(object, problem.GetExpectedBehaviorTypeName());
auto& behaviorContent = problem.GetSourceBehaviorContent();
auto& behaviorMetadata = MetadataProvider::GetBehaviorMetadata(
project.GetCurrentPlatform(), behaviorContent.GetTypeName());
if (MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
continue;
}
auto& behavior = problem.GetSourceBehaviorContent();
auto& behavior = behaviorMetadata.Get();
if (suggestedBehaviorNames.empty()) {
// No matching behavior on the object.
// Add required behaviors on the object.
auto& expectedBehaviorMetadata = MetadataProvider::GetBehaviorMetadata(
project.GetCurrentPlatform(), problem.GetExpectedBehaviorTypeName());
if (MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
if (MetadataProvider::IsBadBehaviorMetadata(expectedBehaviorMetadata)) {
continue;
}
@@ -772,13 +1055,11 @@ bool WholeProjectRefactorer::FixInvalidRequiredBehaviorProperties(
object,
problem.GetExpectedBehaviorTypeName(),
newBehaviorName);
behavior.UpdateProperty(behaviorContent.GetContent(),
problem.GetSourcePropertyName(),
behavior.UpdateProperty(problem.GetSourcePropertyName(),
newBehaviorName);
} else {
// There is a matching behavior on the object use it by default.
behavior.UpdateProperty(
behaviorContent.GetContent(),
problem.GetSourcePropertyName(),
// It's unlikely the object has 2 behaviors of the same type.
suggestedBehaviorNames[0]);
@@ -897,6 +1178,115 @@ void WholeProjectRefactorer::RenameEventsBasedBehavior(
GetBehaviorFullType(eventsFunctionsExtension.GetName(), newBehaviorName));
}
void WholeProjectRefactorer::RenameEventsBasedObject(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::String& oldObjectName,
const gd::String& newObjectName) {
auto& eventsBasedObjects =
eventsFunctionsExtension.GetEventsBasedObjects();
if (!eventsBasedObjects.Has(oldObjectName)) {
gd::LogWarning("Warning, " + oldObjectName +
" was not found when calling RenameEventsBasedObject.");
return;
}
auto& eventsBasedObject = eventsBasedObjects.Get(oldObjectName);
auto renameObjectEventsFunction =
[&project,
&eventsFunctionsExtension,
&oldObjectName,
&newObjectName](const gd::EventsFunction& eventsFunction) {
if (eventsFunction.GetFunctionType() == gd::EventsFunction::Action ||
eventsFunction.GetFunctionType() == gd::EventsFunction::Condition) {
gd::InstructionsTypeRenamer renamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
oldObjectName,
eventsFunction.GetName()),
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
newObjectName,
eventsFunction.GetName()));
ExposeProjectEvents(project, renamer);
} else if (eventsFunction.GetFunctionType() ==
gd::EventsFunction::Expression ||
eventsFunction.GetFunctionType() ==
gd::EventsFunction::StringExpression) {
// Nothing to do, expressions are not including the name of the
// object
}
};
auto renameObjectProperty = [&project,
&eventsFunctionsExtension,
&oldObjectName,
&newObjectName](
const gd::NamedPropertyDescriptor&
property) {
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
oldObjectName,
EventsBasedObject::GetPropertyActionName(property.GetName())),
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
newObjectName,
EventsBasedObject::GetPropertyActionName(property.GetName())));
ExposeProjectEvents(project, actionRenamer);
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
project,
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
oldObjectName,
EventsBasedObject::GetPropertyConditionName(property.GetName())),
GetObjectEventsFunctionFullType(
eventsFunctionsExtension.GetName(),
newObjectName,
EventsBasedObject::GetPropertyConditionName(property.GetName())));
ExposeProjectEvents(project, conditionRenamer);
// Nothing to do for expression, expressions are not including the name of
// the object
};
// Order is important: we first rename the expressions then the instructions,
// to avoid being unable to fetch the metadata (the types of parameters) of
// instructions after they are renamed.
auto& objectEventsFunctions = eventsBasedObject.GetEventsFunctions();
// Object expressions
for (auto&& eventsFunction : objectEventsFunctions.GetInternalVector()) {
if (eventsFunction->GetFunctionType() == gd::EventsFunction::Expression ||
eventsFunction->GetFunctionType() ==
gd::EventsFunction::StringExpression) {
renameObjectEventsFunction(*eventsFunction);
}
}
// Object instructions
for (auto&& eventsFunction : objectEventsFunctions.GetInternalVector()) {
if (eventsFunction->GetFunctionType() == gd::EventsFunction::Action ||
eventsFunction->GetFunctionType() == gd::EventsFunction::Condition) {
renameObjectEventsFunction(*eventsFunction);
}
}
// Object properties
auto& properties = eventsBasedObject.GetPropertyDescriptors();
for (auto&& property : properties.GetInternalVector()) {
renameObjectProperty(*property);
}
DoRenameObject(
project,
GetObjectFullType(eventsFunctionsExtension.GetName(), oldObjectName),
GetObjectFullType(eventsFunctionsExtension.GetName(), newObjectName));
}
void WholeProjectRefactorer::DoRenameEventsFunction(
gd::Project& project,
const gd::EventsFunction& eventsFunction,
@@ -924,18 +1314,9 @@ void WholeProjectRefactorer::DoRenameBehavior(
const gd::String& newBehaviorType) {
auto renameBehaviorTypeInBehaviorContent =
[&oldBehaviorType,
&newBehaviorType](gd::BehaviorContent& behaviorContent) {
if (behaviorContent.GetTypeName() == oldBehaviorType) {
behaviorContent.SetTypeName(newBehaviorType);
}
};
auto renameBehaviorTypeInObjects =
[&renameBehaviorTypeInBehaviorContent](
std::vector<std::unique_ptr<gd::Object> >& objectsList) {
for (auto& object : objectsList) {
for (auto& behaviorContent : object->GetAllBehaviorContents()) {
renameBehaviorTypeInBehaviorContent(*behaviorContent.second);
}
&newBehaviorType](gd::BehaviorConfigurationContainer& behavior) {
if (behavior.GetTypeName() == oldBehaviorType) {
behavior.SetTypeName(newBehaviorType);
}
};
auto renameBehaviorTypeInParameters =
@@ -972,15 +1353,18 @@ void WholeProjectRefactorer::DoRenameBehavior(
}
}
}
// Rename behavior in objects lists.
auto behaviorTypeRenamer = gd::BehaviorTypeRenamer(
project,
oldBehaviorType,
newBehaviorType);
ExposeProjectObjects(project, behaviorTypeRenamer);
// Rename behavior in global objects
renameBehaviorTypeInObjects(project.GetObjects());
// Rename behavior in layout objects and layout behavior shared data.
// Rename behavior in layout behavior shared data.
for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) {
gd::Layout& layout = project.GetLayout(i);
renameBehaviorTypeInObjects(layout.GetObjects());
for (auto& behaviorSharedDataContent : layout.GetAllBehaviorSharedData()) {
renameBehaviorTypeInBehaviorContent(*behaviorSharedDataContent.second);
}
@@ -1003,6 +1387,76 @@ void WholeProjectRefactorer::DoRenameBehavior(
renameBehaviorTypeInParameters(*eventsFunction);
}
}
for (auto&& eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects()
.GetInternalVector()) {
auto& behaviorEventsFunctions = eventsBasedObject->GetEventsFunctions();
for (auto&& eventsFunction :
behaviorEventsFunctions.GetInternalVector()) {
renameBehaviorTypeInParameters(*eventsFunction);
}
}
}
}
void WholeProjectRefactorer::DoRenameObject(
gd::Project& project,
const gd::String& oldObjectType,
const gd::String& newObjectType) {
auto customObjectTypeRenamer = gd::CustomObjectTypeRenamer(
project,
oldObjectType,
newObjectType);
ExposeProjectObjects(project, customObjectTypeRenamer);
auto renameObjectTypeInParameters =
[&oldObjectType, &newObjectType](gd::EventsFunction& eventsFunction) {
for (auto& parameter : eventsFunction.GetParameters()) {
if (gd::ParameterMetadata::IsObject(parameter.GetType()) &&
parameter.GetExtraInfo() == oldObjectType) {
parameter.SetExtraInfo(newObjectType);
}
}
};
// Rename in parameters of (free/behavior) events function
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
e++) {
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
// Behavior object types
for (auto&& eventsBasedBehavior :
eventsFunctionsExtension.GetEventsBasedBehaviors().GetInternalVector()) {
if (eventsBasedBehavior->GetObjectType() == oldObjectType) {
eventsBasedBehavior->SetObjectType(newObjectType);
}
}
for (auto&& eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
renameObjectTypeInParameters(*eventsFunction);
}
for (auto&& eventsBasedBehavior :
eventsFunctionsExtension.GetEventsBasedBehaviors()
.GetInternalVector()) {
auto& behaviorEventsFunctions = eventsBasedBehavior->GetEventsFunctions();
for (auto&& eventsFunction :
behaviorEventsFunctions.GetInternalVector()) {
renameObjectTypeInParameters(*eventsFunction);
}
}
for (auto&& eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects()
.GetInternalVector()) {
auto& behaviorEventsFunctions = eventsBasedObject->GetEventsFunctions();
for (auto&& eventsFunction :
behaviorEventsFunctions.GetInternalVector()) {
renameObjectTypeInParameters(*eventsFunction);
}
}
}
}
@@ -1123,6 +1577,28 @@ void WholeProjectRefactorer::ObjectOrGroupRenamedInLayout(
}
}
}
void WholeProjectRefactorer::ObjectOrGroupRemovedInEventsBasedObject(
gd::Project& project,
gd::EventsBasedObject& eventsBasedObject,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
const gd::String& objectName,
bool isObjectGroup,
bool removeEventsAndGroups) {
for (auto &functionUniquePtr : eventsBasedObject.GetEventsFunctions().GetInternalVector()) {
auto function = functionUniquePtr.get();
WholeProjectRefactorer::ObjectOrGroupRemovedInEventsFunction(
project,
*function,
globalObjectsContainer,
objectsContainer,
objectName,
isObjectGroup,
isObjectGroup);
}
}
void WholeProjectRefactorer::ObjectOrGroupRemovedInEventsFunction(
gd::Project& project,
gd::EventsFunction& eventsFunction,
@@ -1150,6 +1626,27 @@ void WholeProjectRefactorer::ObjectOrGroupRemovedInEventsFunction(
}
}
void WholeProjectRefactorer::ObjectOrGroupRenamedInEventsBasedObject(
gd::Project& project,
gd::EventsBasedObject& eventsBasedObject,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
const gd::String& oldName,
const gd::String& newName,
bool isObjectGroup) {
for (auto &functionUniquePtr : eventsBasedObject.GetEventsFunctions().GetInternalVector()) {
auto function = functionUniquePtr.get();
WholeProjectRefactorer::ObjectOrGroupRenamedInEventsFunction(
project,
*function,
globalObjectsContainer,
objectsContainer,
oldName,
newName,
isObjectGroup);
}
}
void WholeProjectRefactorer::ObjectOrGroupRenamedInEventsFunction(
gd::Project& project,
gd::EventsFunction& eventsFunction,

View File

@@ -18,11 +18,11 @@ class EventsFunctionsExtension;
class EventsFunction;
class ObjectsContainer;
class EventsBasedBehavior;
class EventsBasedObject;
class ArbitraryEventsWorker;
class ArbitraryObjectsWorker;
class ArbitraryEventsWorkerWithContext;
class Behavior;
class BehaviorContent;
class BehaviorMetadata;
class UnfilledRequiredBehaviorPropertyProblem;
} // namespace gd
@@ -61,13 +61,24 @@ class GD_CORE_API WholeProjectRefactorer {
* \brief Call the specified worker on all events of the events based behavior
*
* This should be the preferred way to traverse all the events of an events
* based behavior
* based behavior.
*/
static void ExposeEventsBasedBehaviorEvents(
gd::Project& project,
const gd::EventsBasedBehavior& eventsBasedBehavior,
gd::ArbitraryEventsWorkerWithContext& worker);
/**
* \brief Call the specified worker on all events of the events based object
*
* This should be the preferred way to traverse all the events of an events
* based object.
*/
static void ExposeEventsBasedObjectEvents(
gd::Project& project,
const gd::EventsBasedObject& eventsBasedObject,
gd::ArbitraryEventsWorkerWithContext& worker);
/**
* \brief Call the specified worker on all ObjectContainers of the project
* (global, layouts...)
@@ -119,6 +130,21 @@ class GD_CORE_API WholeProjectRefactorer {
const gd::String& oldFunctionName,
const gd::String& newFunctionName);
/**
* \brief Refactor the project **before** an events function of an object is
* renamed.
*
* \warning Do the renaming of the specified function after calling this.
* This is because the function is expected to have its old name for the
* refactoring.
*/
static void RenameObjectEventsFunction(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject,
const gd::String& oldFunctionName,
const gd::String& newFunctionName);
/**
* \brief Refactor the project **before** an events function parameter
* is moved.
@@ -150,6 +176,22 @@ class GD_CORE_API WholeProjectRefactorer {
std::size_t oldIndex,
std::size_t newIndex);
/**
* \brief Refactor the project **before** the parameter of an events function
* of an object is moved.
*
* \warning Do the move of the specified function parameters after calling
* this. This is because the function is expected to be in its old state for
* the refactoring.
*/
static void MoveObjectEventsFunctionParameter(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject,
const gd::String& functionName,
std::size_t oldIndex,
std::size_t newIndex);
/**
* \brief Refactor the project **before** a property of a behavior is
* renamed.
@@ -165,6 +207,21 @@ class GD_CORE_API WholeProjectRefactorer {
const gd::String& oldPropertyName,
const gd::String& newPropertyName);
/**
* \brief Refactor the project **before** a property of an object is
* renamed.
*
* \warning Do the renaming of the specified property after calling this.
* This is because the property is expected to have its old name for the
* refactoring.
*/
static void RenameEventsBasedObjectProperty(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject,
const gd::String& oldPropertyName,
const gd::String& newPropertyName);
/**
* \brief Add a behavior to an object and add required behaviors if necessary
* to fill every behavior properties of the added behaviors.
@@ -217,6 +274,19 @@ class GD_CORE_API WholeProjectRefactorer {
const gd::String& oldBehaviorName,
const gd::String& newBehaviorName);
/**
* \brief Refactor the project **before** an object is renamed.
*
* \warning Do the renaming of the specified object after calling this.
* This is because the object is expected to have its old name for the
* refactoring.
*/
static void RenameEventsBasedObject(
gd::Project& project,
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::String& oldObjectName,
const gd::String& newObjectName);
/**
* \brief Refactor the project after an object is renamed in a layout
*
@@ -241,6 +311,35 @@ class GD_CORE_API WholeProjectRefactorer {
bool isObjectGroup,
bool removeEventsAndGroups = true);
/**
* \brief Refactor the project after an object is removed in an events-based
* object.
*
* This will update the events of the function and groups.
*/
static void ObjectOrGroupRemovedInEventsBasedObject(
gd::Project& project,
gd::EventsBasedObject& eventsBasedObject,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
const gd::String& objectName,
bool isObjectGroup,
bool removeEventsAndGroups);
/**
* \brief Refactor the events function after an object or group is renamed
*
* This will update the events of the function and groups.
*/
static void ObjectOrGroupRenamedInEventsBasedObject(
gd::Project& project,
gd::EventsBasedObject& eventsBasedObject,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
const gd::String& oldName,
const gd::String& newName,
bool isObjectGroup);
/**
* \brief Refactor the events function after an object or group is renamed
*
@@ -309,6 +408,14 @@ class GD_CORE_API WholeProjectRefactorer {
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedBehavior& eventsBasedBehavior);
/**
* \brief Ensure (adding if necessary) that the functions of the given
* object have the proper mandatory parameters (the "Object").
*/
static void EnsureObjectEventsFunctionsProperParameters(
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
const gd::EventsBasedObject& eventsBasedObject);
virtual ~WholeProjectRefactorer(){};
private:
@@ -324,6 +431,10 @@ class GD_CORE_API WholeProjectRefactorer {
const gd::String& oldBehaviorType,
const gd::String& newBehaviorType);
static void DoRenameObject(gd::Project& project,
const gd::String& oldObjectType,
const gd::String& newObjectType);
static void FindDependentBehaviorNames(
const gd::Project& project,
const gd::Object& object,
@@ -331,6 +442,7 @@ class GD_CORE_API WholeProjectRefactorer {
std::unordered_set<gd::String>& dependentBehaviorNames);
static const gd::String behaviorObjectParameterName;
static const gd::String parentObjectParameterName;
WholeProjectRefactorer(){};
};

View File

@@ -0,0 +1,42 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "AbstractEventsBasedEntity.h"
#include "EventsFunctionsContainer.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Tools/MakeUnique.h"
namespace gd {
AbstractEventsBasedEntity::AbstractEventsBasedEntity(const gd::String& _name)
: name(_name), fullName("") {}
void AbstractEventsBasedEntity::SerializeTo(SerializerElement& element) const {
element.SetAttribute("description", description);
element.SetAttribute("name", name);
element.SetAttribute("fullName", fullName);
gd::SerializerElement& eventsFunctionsElement =
element.AddChild("eventsFunctions");
eventsFunctionsContainer.SerializeEventsFunctionsTo(eventsFunctionsElement);
propertyDescriptors.SerializeElementsTo(
"propertyDescriptor", element.AddChild("propertyDescriptors"));
}
void AbstractEventsBasedEntity::UnserializeFrom(gd::Project& project,
const SerializerElement& element) {
description = element.GetStringAttribute("description");
name = element.GetStringAttribute("name");
fullName = element.GetStringAttribute("fullName");
const gd::SerializerElement& eventsFunctionsElement =
element.GetChild("eventsFunctions");
eventsFunctionsContainer.UnserializeEventsFunctionsFrom(
project, eventsFunctionsElement);
propertyDescriptors.UnserializeElementsFrom(
"propertyDescriptor", element.GetChild("propertyDescriptors"));
}
} // namespace gd

View File

@@ -0,0 +1,151 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_ABSTRACTEVENTSBASEDENTITY_H
#define GDCORE_ABSTRACTEVENTSBASEDENTITY_H
#include <vector>
#include "GDCore/Project/NamedPropertyDescriptor.h"
#include "GDCore/Tools/SerializableWithNameList.h"
#include "GDCore/Project/EventsFunctionsContainer.h"
#include "GDCore/String.h"
namespace gd {
class SerializerElement;
class Project;
} // namespace gd
namespace gd {
/**
* \brief Represents a behavior or an object that is implemented with events.
*
* It's the responsibility of the IDE to run the logic to transform this into a
* real behavior or object, by declaring an extension and running code generation.
* See `EventsFunctionsExtensionsLoader`.
*
* \ingroup PlatformDefinition
*/
class GD_CORE_API AbstractEventsBasedEntity {
public:
AbstractEventsBasedEntity(const gd::String& _name);
virtual ~AbstractEventsBasedEntity(){};
/**
* \brief Return a pointer to a new AbstractEventsBasedEntity constructed from
* this one.
*/
AbstractEventsBasedEntity* Clone() const { return new AbstractEventsBasedEntity(*this); };
/**
* \brief Get the description of the behavior or object, that is displayed in the
* editor.
*/
const gd::String& GetDescription() const { return description; };
/**
* \brief Set the description of the behavior or object, to be displayed in the editor.
*/
virtual AbstractEventsBasedEntity& SetDescription(const gd::String& description_) {
description = description_;
return *this;
}
/**
* \brief Get the internal name of the behavior or object.
*/
const gd::String& GetName() const { return name; };
/**
* \brief Set the internal name of the behavior or object.
*/
AbstractEventsBasedEntity& SetName(const gd::String& name_) {
name = name_;
return *this;
}
/**
* \brief Get the name of the behavior or object, that is displayed in the editor.
*/
const gd::String& GetFullName() const { return fullName; };
/**
* \brief Set the name of the behavior or object, to be displayed in the editor.
*/
AbstractEventsBasedEntity& SetFullName(const gd::String& fullName_) {
fullName = fullName_;
return *this;
}
/**
* \brief Return a reference to the functions of the events based behavior or object.
*/
EventsFunctionsContainer& GetEventsFunctions() {
return eventsFunctionsContainer;
}
/**
* \brief Return a const reference to the functions of the events based
* behavior or object.
*/
const EventsFunctionsContainer& GetEventsFunctions() const {
return eventsFunctionsContainer;
}
/**
* \brief Return a reference to the list of the properties.
*/
SerializableWithNameList<NamedPropertyDescriptor>& GetPropertyDescriptors() {
return propertyDescriptors;
}
/**
* \brief Return a const reference to the list of the properties.
*/
const SerializableWithNameList<NamedPropertyDescriptor>& GetPropertyDescriptors()
const {
return propertyDescriptors;
}
/**
* \brief Get the name of the action to change a property.
*/
static gd::String GetPropertyActionName(const gd::String& propertyName) { return "SetProperty" + propertyName; };
/**
* \brief Get the name of the condition to compare a property.
*/
static gd::String GetPropertyConditionName(const gd::String& propertyName) { return "Property" + propertyName; };
/**
* \brief Get the name of the expression to get a property.
*/
static gd::String GetPropertyExpressionName(const gd::String& propertyName) { return "Property" + propertyName; };
/** \name Serialization
*/
///@{
/**
* \brief Serialize the AbstractEventsBasedEntity to the specified element
*/
virtual void SerializeTo(gd::SerializerElement& element) const;
/**
* \brief Load the AbstractEventsBasedEntity from the specified element
*/
virtual void UnserializeFrom(gd::Project& project,
const gd::SerializerElement& element);
///@}
private:
gd::String name;
gd::String fullName;
gd::String description;
gd::EventsFunctionsContainer eventsFunctionsContainer;
SerializableWithNameList<NamedPropertyDescriptor> propertyDescriptors;
};
} // namespace gd
#endif // GDCORE_ABSTRACTEVENTSBASEDENTITY_H

View File

@@ -5,20 +5,10 @@
*/
#include "GDCore/Project/Behavior.h"
#include <iostream>
#if defined(GD_IDE_ONLY)
#include "GDCore/Project/PropertyDescriptor.h"
#endif
namespace gd {
Behavior::~Behavior(){};
#if defined(GD_IDE_ONLY)
std::map<gd::String, gd::PropertyDescriptor> Behavior::GetProperties(
const gd::SerializerElement& behaviorContent) const {
std::map<gd::String, gd::PropertyDescriptor> nothing;
return nothing;
}
#endif
} // namespace gd

View File

@@ -5,86 +5,28 @@
*/
#ifndef GDCORE_BEHAVIOR_H
#define GDCORE_BEHAVIOR_H
#include <map>
#include "GDCore/String.h"
#if defined(GD_IDE_ONLY)
namespace gd {
class PropertyDescriptor;
}
#endif
namespace gd {
class SerializerElement;
class Project;
class Layout;
} // namespace gd
#include "GDCore/Project/BehaviorConfigurationContainer.h"
namespace gd {
/**
* \brief Base class used to represents a behavior that can be applied to an
* object
* object. It stores the content (i.e: the properties) of a behavior of an object.
*
* \see gd::BehaviorContent
* \see gd::BehaviorsSharedData
* \see gd::Object
* \ingroup PlatformDefinition
*/
class GD_CORE_API Behavior {
class GD_CORE_API Behavior: public BehaviorConfigurationContainer {
public:
Behavior(){};
Behavior(): BehaviorConfigurationContainer() {};
Behavior(const gd::String& name_, const gd::String& type_)
: BehaviorConfigurationContainer(name_, type_) {};
virtual ~Behavior();
virtual Behavior* Clone() const { return new Behavior(*this); }
/**
* \brief Return the type of the behavior
*/
const gd::String& GetTypeName() const { return type; }
/**
* \brief Set the type of the behavior.
*/
void SetTypeName(const gd::String& type_) { type = type_; };
#if defined(GD_IDE_ONLY)
/**
* \brief Called when the IDE wants to know about the custom properties of the
* behavior.
*
* Implementation example:
\code
std::map<gd::String, gd::PropertyDescriptor> properties;
properties[_("Initial speed")].SetValue(gd::String::From(initialSpeed));
return properties;
\endcode
*
* \return a std::map with properties names as key.
* \see gd::PropertyDescriptor
*/
virtual std::map<gd::String, gd::PropertyDescriptor> GetProperties(
const gd::SerializerElement& behaviorContent) const;
/**
* \brief Called when the IDE wants to update a custom property of the
* behavior
*
* \return false if the new value cannot be set
* \see gd::InitialInstance
*/
virtual bool UpdateProperty(gd::SerializerElement& behaviorContent,
const gd::String& name,
const gd::String& value) {
return false;
};
#endif
/**
* \brief Called to initialize the content with the default properties
* for the behavior.
*/
virtual void InitializeContent(gd::SerializerElement& behaviorContent){};
private:
gd::String type;
virtual Behavior* Clone() const override { return new Behavior(*this); }
};
} // namespace gd

View File

@@ -0,0 +1,25 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "GDCore/Project/BehaviorConfigurationContainer.h"
#include <iostream>
#include "GDCore/Project/PropertyDescriptor.h"
namespace gd {
BehaviorConfigurationContainer::~BehaviorConfigurationContainer(){};
std::map<gd::String, gd::PropertyDescriptor> BehaviorConfigurationContainer::GetProperties() const {
return GetProperties(content);
};
std::map<gd::String, gd::PropertyDescriptor> BehaviorConfigurationContainer::GetProperties(
const gd::SerializerElement& behaviorContent) const {
std::map<gd::String, gd::PropertyDescriptor> nothing;
return nothing;
}
} // namespace gd

View File

@@ -0,0 +1,155 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_BEHAVIORCONFIGURATIONCONTAINER_H
#define GDCORE_BEHAVIORCONFIGURATIONCONTAINER_H
#include <map>
#include <memory>
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/String.h"
namespace gd {
class PropertyDescriptor;
class SerializerElement;
class Project;
class Layout;
} // namespace gd
namespace gd {
/**
* \brief Base class for containers of behavior configuration.
* They can be attached to objects (Behavior) or layouts (BehaviorsSharedData).
* It stores the content (i.e: the properties) of a behavior of an object.
*
* \see gd::Behavior
* \see gd::BehaviorsSharedData
* \ingroup PlatformDefinition
*/
class GD_CORE_API BehaviorConfigurationContainer {
public:
BehaviorConfigurationContainer(){};
BehaviorConfigurationContainer(const gd::String& name_, const gd::String& type_)
: name(name_), type(type_){};
virtual ~BehaviorConfigurationContainer();
virtual BehaviorConfigurationContainer* Clone() const { return new BehaviorConfigurationContainer(*this); }
/**
* \brief Return the name identifying the behavior
*/
const gd::String& GetName() const { return name; }
/**
* \brief Change the name identifying the behavior
*/
void SetName(const gd::String& name_) { name = name_; }
/**
* \brief Return the type of the behavior
*/
const gd::String& GetTypeName() const { return type; }
/**
* \brief Set the type of the behavior.
*/
void SetTypeName(const gd::String& type_) { type = type_; };
/**
* \brief Called when the IDE wants to know about the custom properties of the
* behavior.
*
* \return a std::map with properties names as key.
* \see gd::PropertyDescriptor
*/
std::map<gd::String, gd::PropertyDescriptor> GetProperties() const;
/**
* \brief Called when the IDE wants to update a custom property of the
* behavior
*
* \return false if the new value cannot be set
* \see gd::InitialInstance
*/
bool UpdateProperty(const gd::String& name, const gd::String& value) {
return UpdateProperty(content, name, value);
};
/**
* \brief Called to initialize the content with the default properties
* for the behavior.
*/
virtual void InitializeContent() {
InitializeContent(content);
};
/**
* \brief Serialize the behavior content.
*/
virtual void SerializeTo(gd::SerializerElement& element) const {
element = content;
};
/**
* \brief Unserialize the behavior content.
*/
virtual void UnserializeFrom(const gd::SerializerElement& element) {
content = element;
};
const gd::SerializerElement& GetContent() const { return content; };
gd::SerializerElement& GetContent() { return content; };
protected:
/**
* \brief Called when the IDE wants to know about the custom properties of the
* behavior.
*
* Implementation example:
\code
std::map<gd::String, gd::PropertyDescriptor> properties;
properties[_("Initial speed")].SetValue(gd::String::From(initialSpeed));
return properties;
\endcode
*
* \return a std::map with properties names as key.
* \see gd::PropertyDescriptor
*/
virtual std::map<gd::String, gd::PropertyDescriptor> GetProperties(
const gd::SerializerElement& behaviorContent) const;
/**
* \brief Called when the IDE wants to update a custom property of the
* behavior
*
* \return false if the new value cannot be set
* \see gd::InitialInstance
*/
virtual bool UpdateProperty(gd::SerializerElement& behaviorContent,
const gd::String& name,
const gd::String& value) {
return false;
};
/**
* \brief Called to initialize the content with the default properties
* for the behavior.
*/
virtual void InitializeContent(gd::SerializerElement& behaviorContent){};
private:
gd::String name; ///< Name of the behavior
gd::String type; ///< The type of the behavior that is represented. Usually
///< in the form "ExtensionName::BehaviorTypeName"
gd::SerializerElement content; // Storage for the behavior properties
};
} // namespace gd
#endif // GDCORE_BEHAVIORCONFIGURATIONCONTAINER_H

View File

@@ -1,12 +0,0 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "GDCore/Project/BehaviorContent.h"
namespace gd {
BehaviorContent::~BehaviorContent(){};
} // namespace gd

View File

@@ -1,88 +0,0 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_BEHAVIORCONTENT_H
#define GDCORE_BEHAVIORCONTENT_H
#include <map>
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/String.h"
#if defined(GD_IDE_ONLY)
namespace gd {
class PropertyDescriptor;
}
#endif
namespace gd {
class SerializerElement;
class Project;
class Layout;
} // namespace gd
namespace gd {
/**
* \brief Store the content (i.e: the properties) of a behavior of an object.
*
* \see gd::Behavior
* \see gd::BehaviorsSharedData
* \see gd::Object
* \ingroup PlatformDefinition
*/
class GD_CORE_API BehaviorContent {
public:
BehaviorContent(const gd::String& name_, const gd::String& type_)
: name(name_), type(type_){};
virtual ~BehaviorContent();
virtual BehaviorContent* Clone() const { return new BehaviorContent(*this); }
/**
* \brief Return the name identifying the behavior
*/
virtual const gd::String& GetName() const { return name; }
/**
* \brief Change the name identifying the behavior
*/
virtual void SetName(const gd::String& name_) { name = name_; }
/**
* \brief Get the type of the behavior.
*/
virtual const gd::String& GetTypeName() const { return type; }
/**
* \brief Change the type of the behavior
*/
virtual void SetTypeName(const gd::String& type_) { type = type_; }
#if defined(GD_IDE_ONLY)
/**
* \brief Serialize the behavior content.
*/
virtual void SerializeTo(gd::SerializerElement& element) const {
element = content;
};
#endif
/**
* \brief Unserialize the behavior content.
*/
virtual void UnserializeFrom(const gd::SerializerElement& element) {
content = element;
};
const gd::SerializerElement& GetContent() const { return content; };
gd::SerializerElement& GetContent() { return content; };
protected:
gd::String name; ///< Name of the behavior
gd::String type; ///< The type of the behavior that is represented. Usually
///< in the form "ExtensionName::BehaviorTypeName"
gd::SerializerElement content; // Storage for the behavior properties
};
} // namespace gd
#endif // GDCORE_BEHAVIORCONTENT_H

View File

@@ -5,21 +5,11 @@
*/
#include "GDCore/Project/BehaviorsSharedData.h"
#if defined(GD_IDE_ONLY)
#include <map>
#include "GDCore/Project/PropertyDescriptor.h"
#endif
namespace gd {
BehaviorsSharedData::~BehaviorsSharedData(){};
#if defined(GD_IDE_ONLY)
std::map<gd::String, gd::PropertyDescriptor> BehaviorsSharedData::GetProperties(
const gd::SerializerElement& behaviorSharedDataContent) const {
std::map<gd::String, gd::PropertyDescriptor> nothing;
return nothing;
}
#endif
} // namespace gd

View File

@@ -4,19 +4,11 @@
* reserved. This project is released under the MIT License.
*/
#ifndef BEHAVIORSSHAREDDATA_H
#define BEHAVIORSSHAREDDATA_H
#ifndef GDCORE_BEHAVIORSSHAREDDATA_H
#define GDCORE_BEHAVIORSSHAREDDATA_H
#include <map>
#include <memory>
#include "GDCore/String.h"
class BehaviorsRuntimeSharedData;
namespace gd {
class SerializerElement;
class PropertyDescriptor;
class Project;
class Layout;
} // namespace gd
#include "GDCore/Project/BehaviorConfigurationContainer.h"
namespace gd {
@@ -29,63 +21,15 @@ namespace gd {
*
* \ingroup GameEngine
*/
class GD_CORE_API BehaviorsSharedData {
class GD_CORE_API BehaviorsSharedData: public BehaviorConfigurationContainer {
public:
BehaviorsSharedData(){};
BehaviorsSharedData(): BehaviorConfigurationContainer() {};
BehaviorsSharedData(const gd::String& name_, const gd::String& type_)
: BehaviorConfigurationContainer(name_, type_) {};
virtual ~BehaviorsSharedData();
virtual gd::BehaviorsSharedData* Clone() const {
return new BehaviorsSharedData(*this);
}
/**
* \brief Return the name identifying the type of the behavior
*/
gd::String GetTypeName() { return type; }
/**
* \brief Change name identifying the type of the behavior.
*/
void SetTypeName(const gd::String& type_) { type = type_; };
#if defined(GD_IDE_ONLY)
/**
* \brief Called when the IDE wants to know about the properties of the shared
data.
*
* Usage example:
\code
std::map<gd::String, gd::PropertyDescriptor> properties;
properties[_("Initial speed")].SetValue(gd::String::From(initialSpeed));
return properties;
\endcode
*
* \return a std::map with properties names as key.
* \see gd::PropertyDescriptor
*/
virtual std::map<gd::String, gd::PropertyDescriptor> GetProperties(
const gd::SerializerElement& behaviorSharedDataContent) const;
/**
* \brief Called when the IDE wants to update a property of the shared data
*
* \return false if the new value cannot be set
* \see gd::InitialInstance
*/
virtual bool UpdateProperty(gd::SerializerElement& behaviorSharedDataContent,
const gd::String& name,
const gd::String& value) {
return false;
};
#endif
virtual void InitializeContent(
gd::SerializerElement& behaviorSharedDataContent){};
private:
gd::String type; ///< The type indicate of which type is the behavior.
virtual BehaviorsSharedData* Clone() const override { return new BehaviorsSharedData(*this); }
};
} // namespace gd
#endif // BEHAVIORSSHAREDDATA_H
#endif // GDCORE_BEHAVIORSSHAREDDATA_H

View File

@@ -0,0 +1,114 @@
#include "CustomBehavior.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/Serialization/SerializerElement.h"
#include <map>
using namespace gd;
CustomBehavior *CustomBehavior::Clone() const {
CustomBehavior *clone = new CustomBehavior(*this);
return clone;
}
std::map<gd::String, gd::PropertyDescriptor> CustomBehavior::GetProperties(
const gd::SerializerElement &behaviorContent) const {
auto behaviorProperties = std::map<gd::String, gd::PropertyDescriptor>();
if (!project.HasEventsBasedBehavior(GetTypeName())) {
return behaviorProperties;
}
const auto &eventsBasedBehavior = project.GetEventsBasedBehavior(GetTypeName());
const auto &properties = eventsBasedBehavior.GetPropertyDescriptors();
for (auto &property : properties.GetInternalVector()) {
const auto &propertyName = property->GetName();
const auto &propertyType = property->GetType();
// TODO Move this into a PropertyDescriptor copy method.
auto &newProperty = behaviorProperties[propertyName]
.SetType(property->GetType())
.SetDescription(property->GetDescription())
.SetGroup(property->GetGroup())
.SetLabel(property->GetLabel())
.SetValue(property->GetValue())
.SetHidden(property->IsHidden());
for (auto &extraInfo : property->GetExtraInfo()) {
newProperty.AddExtraInfo(extraInfo);
}
if (behaviorContent.HasChild(propertyName)) {
if (propertyType == "String" || propertyType == "Choice" ||
propertyType == "Color" || propertyType == "Behavior") {
newProperty.SetValue(
behaviorContent.GetChild(propertyName).GetStringValue());
} else if (propertyType == "Number") {
newProperty.SetValue(gd::String::From(
behaviorContent.GetChild(propertyName).GetDoubleValue()));
} else if (propertyType == "Boolean") {
newProperty.SetValue(
behaviorContent.GetChild(propertyName).GetBoolValue() ? "true"
: "false");
}
} else {
// No value was serialized for this property. `newProperty`
// will have the default value coming from `enumeratedProperty`.
}
}
return behaviorProperties;
}
bool CustomBehavior::UpdateProperty(gd::SerializerElement &behaviorContent,
const gd::String &propertyName,
const gd::String &newValue) {
if (!project.HasEventsBasedBehavior(GetTypeName())) {
return false;
}
const auto &eventsBasedBehavior = project.GetEventsBasedBehavior(GetTypeName());
const auto &properties = eventsBasedBehavior.GetPropertyDescriptors();
if (!properties.Has(propertyName)) {
return false;
}
const auto &property = properties.Get(propertyName);
auto &element = behaviorContent.AddChild(propertyName);
const gd::String &propertyType = property.GetType();
if (propertyType == "String" || propertyType == "Choice" ||
propertyType == "Color" || propertyType == "Behavior") {
element.SetStringValue(newValue);
} else if (propertyType == "Number") {
element.SetDoubleValue(newValue.To<double>());
} else if (propertyType == "Boolean") {
element.SetBoolValue(newValue == "1");
}
return true;
}
void CustomBehavior::InitializeContent(gd::SerializerElement &behaviorContent) {
if (!project.HasEventsBasedBehavior(GetTypeName())) {
return;
}
const auto &eventsBasedBehavior = project.GetEventsBasedBehavior(GetTypeName());
const auto &properties = eventsBasedBehavior.GetPropertyDescriptors();
for (auto &&property : properties.GetInternalVector()) {
auto element = behaviorContent.AddChild(property->GetName());
auto propertyType = property->GetType();
if (propertyType == "String" || propertyType == "Choice" ||
propertyType == "Color" || propertyType == "Behavior") {
element.SetStringValue(property->GetValue());
} else if (propertyType == "Number") {
element.SetDoubleValue(property->GetValue().To<double>());
} else if (propertyType == "Boolean") {
element.SetBoolValue(property->GetValue() == "true");
}
}
}

View File

@@ -0,0 +1,39 @@
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/EventsBasedBehavior.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/Serialization/SerializerElement.h"
using namespace gd;
/**
* \brief A gd::Behavior that stores its content in JSON and forward the
* properties related functions to Javascript with Emscripten.
*/
class CustomBehavior : public gd::Behavior {
public:
CustomBehavior(const gd::String &name,
const Project &project_,
const gd::String &fullType)
: Behavior(name, fullType),
project(project_) {}
CustomBehavior *Clone() const override;
using Behavior::GetProperties;
using Behavior::InitializeContent;
using Behavior::UpdateProperty;
protected:
virtual std::map<gd::String, gd::PropertyDescriptor>
GetProperties(const gd::SerializerElement &behaviorContent) const override;
virtual bool UpdateProperty(gd::SerializerElement &behaviorContent,
const gd::String &name,
const gd::String &value) override;
virtual void
InitializeContent(gd::SerializerElement &behaviorContent) override;
private:
const Project &project; ///< The project is used to get the
///< EventBasedBehavior from the fullType.
};

View File

@@ -0,0 +1,165 @@
#include "CustomObject.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/Serialization/SerializerElement.h"
#include <map>
using namespace gd;
std::unique_ptr<gd::Object> CustomObject::Clone() const {
CustomObject* clone = new CustomObject(*this);
return std::unique_ptr<gd::Object>(clone);
}
// TODO EBO Extract a class from Object for the object configuration.
// This will allow CustomObject to have a ObjectConfiguration composed of
// ObjectConfiguration for their children in addition to its own properties.
// This will be used by the GUI to display custom editors (for sprites for
// instance)
std::map<gd::String, gd::PropertyDescriptor> CustomObject::GetProperties() const {
auto objectProperties = std::map<gd::String, gd::PropertyDescriptor>();
if (!project.HasEventsBasedObject(GetType())) {
return objectProperties;
}
const auto &eventsBasedObject = project.GetEventsBasedObject(GetType());
const auto &properties = eventsBasedObject.GetPropertyDescriptors();
for (auto &property : properties.GetInternalVector()) {
const auto &propertyName = property->GetName();
const auto &propertyType = property->GetType();
// TODO Move this into a PropertyDescriptor copy method.
auto &newProperty = objectProperties[propertyName]
.SetType(property->GetType())
.SetDescription(property->GetDescription())
.SetGroup(property->GetGroup())
.SetLabel(property->GetLabel())
.SetValue(property->GetValue())
.SetHidden(property->IsHidden());
for (auto &extraInfo : property->GetExtraInfo()) {
newProperty.AddExtraInfo(extraInfo);
}
if (objectContent.HasChild(propertyName)) {
if (
propertyType == "String" ||
propertyType == "Choice" ||
propertyType == "Color"
) {
newProperty.SetValue(
objectContent.GetChild(propertyName).GetStringValue()
);
} else if (propertyType == "Number") {
newProperty.SetValue(
gd::String::From(objectContent.GetChild(propertyName).GetDoubleValue())
);
} else if (propertyType == "Boolean") {
newProperty.SetValue(
objectContent.GetChild(propertyName).GetBoolValue()
? "true"
: "false"
);
}
} else {
// No value was serialized for this property. `newProperty`
// will have the default value coming from `enumeratedProperty`.
}
}
return objectProperties;
}
bool CustomObject::UpdateProperty(const gd::String& propertyName,
const gd::String& newValue) {
if (!project.HasEventsBasedObject(GetType())) {
return false;
}
const auto &eventsBasedObject = project.GetEventsBasedObject(GetType());
const auto &properties = eventsBasedObject.GetPropertyDescriptors();
if (!properties.Has(propertyName)) {
return false;
}
const auto &property = properties.Get(propertyName);
auto &element = objectContent.AddChild(propertyName);
const gd::String &propertyType = property.GetType();
if (
propertyType == "String" ||
propertyType == "Choice" ||
propertyType == "Color"
) {
element.SetStringValue(newValue);
} else if (propertyType == "Number") {
element.SetDoubleValue(newValue.To<double>());
} else if (propertyType == "Boolean") {
element.SetBoolValue(newValue == "1");
}
return true;
}
std::map<gd::String, gd::PropertyDescriptor>
CustomObject::GetInitialInstanceProperties(
const gd::InitialInstance& instance,
gd::Project& project,
gd::Layout& scene) {
return std::map<gd::String, gd::PropertyDescriptor>();
}
bool CustomObject::UpdateInitialInstanceProperty(
gd::InitialInstance& instance,
const gd::String& name,
const gd::String& value,
gd::Project& project,
gd::Layout& scene) {
return false;
}
void CustomObject::DoSerializeTo(SerializerElement& arg0) const {
arg0.AddChild("content") = objectContent;
}
void CustomObject::DoUnserializeFrom(Project& arg0,
const SerializerElement& arg1) {
objectContent = arg1.GetChild("content");
}
void CustomObject::ExposeResources(
gd::ArbitraryResourceWorker& worker) {
std::map<gd::String, gd::PropertyDescriptor> properties = GetProperties();
for (auto& property : properties) {
const String& propertyName = property.first;
const gd::PropertyDescriptor& propertyDescriptor = property.second;
if (propertyDescriptor.GetType() == "resource") {
auto& extraInfo = propertyDescriptor.GetExtraInfo();
const gd::String& resourceType = extraInfo.empty() ? "" : extraInfo[0];
const gd::String& oldPropertyValue = propertyDescriptor.GetValue();
gd::String newPropertyValue = oldPropertyValue;
if (resourceType == "image") {
worker.ExposeImage(newPropertyValue);
} else if (resourceType == "audio") {
worker.ExposeAudio(newPropertyValue);
} else if (resourceType == "font") {
worker.ExposeFont(newPropertyValue);
} else if (resourceType == "video") {
worker.ExposeVideo(newPropertyValue);
} else if (resourceType == "json") {
worker.ExposeJson(newPropertyValue);
} else if (resourceType == "bitmapFont") {
worker.ExposeBitmapFont(newPropertyValue);
}
if (newPropertyValue != oldPropertyValue) {
UpdateProperty(propertyName, newPropertyValue);
}
}
}
}

View File

@@ -0,0 +1,49 @@
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/EventsBasedObject.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/Serialization/SerializerElement.h"
using namespace gd;
/**
* \brief A gd::Object that stores its content in JSON and forward the
* properties related functions to Javascript with Emscripten.
*
* It also implements "ExposeResources" to expose the properties of type
* "resource".
*/
class CustomObject : public gd::Object {
public:
CustomObject(const gd::String &name, const Project& project_, const gd::String &fullType)
: Object(name),
project(project_) {
SetType(fullType);
}
std::unique_ptr<gd::Object> Clone() const override;
std::map<gd::String, gd::PropertyDescriptor> GetProperties() const override;
bool UpdateProperty(const gd::String& name, const gd::String& value) override;
std::map<gd::String, gd::PropertyDescriptor> GetInitialInstanceProperties(
const gd::InitialInstance& instance,
gd::Project& project,
gd::Layout& scene) override;
bool UpdateInitialInstanceProperty(gd::InitialInstance& instance,
const gd::String& name,
const gd::String& value,
gd::Project& project,
gd::Layout& scene) override;
void ExposeResources(gd::ArbitraryResourceWorker& worker) override;
protected:
void DoSerializeTo(SerializerElement& element) const override;
void DoUnserializeFrom(Project& project, const SerializerElement& element) override;
private:
const Project& project; ///< The project is used to get the
///< EventBasedObject from the fullType.
gd::SerializerElement objectContent;
};

View File

@@ -3,7 +3,6 @@
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY)
#include "EventsBasedBehavior.h"
#include "EventsFunctionsContainer.h"
#include "GDCore/Serialization/SerializerElement.h"
@@ -12,36 +11,17 @@
namespace gd {
EventsBasedBehavior::EventsBasedBehavior()
: name("MyBehavior"), fullName("") {}
: AbstractEventsBasedEntity("MyBehavior") {}
void EventsBasedBehavior::SerializeTo(SerializerElement& element) const {
element.SetAttribute("description", description);
element.SetAttribute("name", name);
element.SetAttribute("fullName", fullName);
AbstractEventsBasedEntity::SerializeTo(element);
element.SetAttribute("objectType", objectType);
gd::SerializerElement& eventsFunctionsElement =
element.AddChild("eventsFunctions");
eventsFunctionsContainer.SerializeEventsFunctionsTo(eventsFunctionsElement);
propertyDescriptors.SerializeElementsTo(
"propertyDescriptor", element.AddChild("propertyDescriptors"));
}
void EventsBasedBehavior::UnserializeFrom(gd::Project& project,
const SerializerElement& element) {
description = element.GetStringAttribute("description");
name = element.GetStringAttribute("name");
fullName = element.GetStringAttribute("fullName");
AbstractEventsBasedEntity::UnserializeFrom(project, element);
objectType = element.GetStringAttribute("objectType");
const gd::SerializerElement& eventsFunctionsElement =
element.GetChild("eventsFunctions");
eventsFunctionsContainer.UnserializeEventsFunctionsFrom(
project, eventsFunctionsElement);
propertyDescriptors.UnserializeElementsFrom(
"propertyDescriptor", element.GetChild("propertyDescriptors"));
}
} // namespace gd
#endif

View File

@@ -3,11 +3,11 @@
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY)
#ifndef GDCORE_EVENTSBASEDBEHAVIOR_H
#define GDCORE_EVENTSBASEDBEHAVIOR_H
#include <vector>
#include "GDCore/Project/AbstractEventsBasedEntity.h"
#include "GDCore/Project/NamedPropertyDescriptor.h"
#include "GDCore/Tools/SerializableWithNameList.h"
#include "GDCore/Project/EventsFunctionsContainer.h"
@@ -28,7 +28,7 @@ namespace gd {
*
* \ingroup PlatformDefinition
*/
class GD_CORE_API EventsBasedBehavior {
class GD_CORE_API EventsBasedBehavior: public AbstractEventsBasedEntity {
public:
EventsBasedBehavior();
virtual ~EventsBasedBehavior(){};
@@ -39,43 +39,24 @@ class GD_CORE_API EventsBasedBehavior {
*/
EventsBasedBehavior* Clone() const { return new EventsBasedBehavior(*this); };
/**
* \brief Get the description of the behavior, that is displayed in the
* editor.
*/
const gd::String& GetDescription() const { return description; };
/**
* \brief Set the description of the behavior, to be displayed in the editor.
*/
EventsBasedBehavior& SetDescription(const gd::String& description_) {
description = description_;
EventsBasedBehavior& SetDescription(const gd::String& description_) override {
AbstractEventsBasedEntity::SetDescription(description_);
return *this;
}
/**
* \brief Get the internal name of the behavior.
*/
const gd::String& GetName() const { return name; };
/**
* \brief Set the internal name of the behavior.
*/
EventsBasedBehavior& SetName(const gd::String& name_) {
name = name_;
AbstractEventsBasedEntity::SetName(name_);
return *this;
}
/**
* \brief Get the name of the behavior, that is displayed in the editor.
*/
const gd::String& GetFullName() const { return fullName; };
/**
* \brief Set the name of the behavior, to be displayed in the editor.
*/
EventsBasedBehavior& SetFullName(const gd::String& fullName_) {
fullName = fullName_;
AbstractEventsBasedEntity::SetFullName(fullName_);
return *this;
}
@@ -92,76 +73,15 @@ class GD_CORE_API EventsBasedBehavior {
return *this;
}
/**
* \brief Return a reference to the functions of the events based behavior.
*/
EventsFunctionsContainer& GetEventsFunctions() {
return eventsFunctionsContainer;
}
void SerializeTo(SerializerElement& element) const override;
/**
* \brief Return a const reference to the functions of the events based
* behavior.
*/
const EventsFunctionsContainer& GetEventsFunctions() const {
return eventsFunctionsContainer;
}
/**
* \brief Return a reference to the list of the properties.
*/
SerializableWithNameList<NamedPropertyDescriptor>& GetPropertyDescriptors() {
return propertyDescriptors;
}
/**
* \brief Return a const reference to the list of the properties.
*/
const SerializableWithNameList<NamedPropertyDescriptor>& GetPropertyDescriptors()
const {
return propertyDescriptors;
}
/**
* \brief Get the name of the action to change a property.
*/
static gd::String GetPropertyActionName(const gd::String& propertyName) { return "SetProperty" + propertyName; };
/**
* \brief Get the name of the condition to compare a property.
*/
static gd::String GetPropertyConditionName(const gd::String& propertyName) { return "Property" + propertyName; };
/**
* \brief Get the name of the expression to get a property.
*/
static gd::String GetPropertyExpressionName(const gd::String& propertyName) { return "Property" + propertyName; };
/** \name Serialization
*/
///@{
/**
* \brief Serialize the EventsBasedBehavior to the specified element
*/
void SerializeTo(gd::SerializerElement& element) const;
/**
* \brief Load the EventsBasedBehavior from the specified element
*/
void UnserializeFrom(gd::Project& project,
const gd::SerializerElement& element);
///@}
const SerializerElement& element) override;
private:
gd::String name;
gd::String fullName;
gd::String description;
gd::String objectType;
gd::EventsFunctionsContainer eventsFunctionsContainer;
SerializableWithNameList<NamedPropertyDescriptor> propertyDescriptors;
};
} // namespace gd
#endif // GDCORE_EVENTSBASEDBEHAVIOR_H
#endif

View File

@@ -0,0 +1,36 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "EventsBasedObject.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Serialization/SerializerElement.h"
namespace gd {
EventsBasedObject::EventsBasedObject()
: AbstractEventsBasedEntity("MyObject"), ObjectsContainer() {
}
EventsBasedObject::~EventsBasedObject() {}
EventsBasedObject::EventsBasedObject(const gd::EventsBasedObject &_eventBasedObject)
: AbstractEventsBasedEntity(_eventBasedObject) {
// TODO Add a copy constructor in ObjectsContainer.
initialObjects = gd::Clone(_eventBasedObject.initialObjects);
objectGroups = _eventBasedObject.objectGroups;
}
void EventsBasedObject::SerializeTo(SerializerElement& element) const {
AbstractEventsBasedEntity::SerializeTo(element);
SerializeObjectsTo(element.AddChild("objects"));
}
void EventsBasedObject::UnserializeFrom(gd::Project& project,
const SerializerElement& element) {
AbstractEventsBasedEntity::UnserializeFrom(project, element);
UnserializeObjectsFrom(project, element.GetChild("objects"));
}
} // namespace gd

View File

@@ -0,0 +1,72 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_EVENTSBASEDOBJECT_H
#define GDCORE_EVENTSBASEDOBJECT_H
#include <vector>
#include "GDCore/Project/AbstractEventsBasedEntity.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/String.h"
namespace gd {
class SerializerElement;
class Project;
} // namespace gd
namespace gd {
/**
* \brief Represents an object that is implemented with events.
*
* It's the responsibility of the IDE to run the logic to transform this into a
* real object, by declaring an extension and running code generation.
* See `EventsFunctionsExtensionsLoader`.
*
* \ingroup PlatformDefinition
*/
class GD_CORE_API EventsBasedObject: public AbstractEventsBasedEntity, public ObjectsContainer {
public:
EventsBasedObject();
virtual ~EventsBasedObject();
EventsBasedObject(const gd::EventsBasedObject &_eventBasedObject);
/**
* \brief Return a pointer to a new EventsBasedObject constructed from
* this one.
*/
EventsBasedObject* Clone() const { return new EventsBasedObject(*this); };
EventsBasedObject& SetDescription(const gd::String& description_) override {
AbstractEventsBasedEntity::SetDescription(description_);
return *this;
}
/**
* \brief Set the internal name of the object.
*/
EventsBasedObject& SetName(const gd::String& name_) {
AbstractEventsBasedEntity::SetName(name_);
return *this;
}
/**
* \brief Set the name of the object, to be displayed in the editor.
*/
EventsBasedObject& SetFullName(const gd::String& fullName_) {
AbstractEventsBasedEntity::SetFullName(fullName_);
return *this;
}
void SerializeTo(SerializerElement& element) const override;
void UnserializeFrom(gd::Project& project,
const SerializerElement& element) override;
private:
};
} // namespace gd
#endif // GDCORE_EVENTSBASEDOBJECT_H

View File

@@ -6,6 +6,7 @@
#include "EventsFunctionsExtension.h"
#include "EventsBasedBehavior.h"
#include "EventsBasedObject.h"
#include "EventsFunction.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Tools/MakeUnique.h"
@@ -42,6 +43,7 @@ void EventsFunctionsExtension::Init(const gd::EventsFunctionsExtension& other) {
helpPath = other.helpPath;
EventsFunctionsContainer::Init(other);
eventsBasedBehaviors = other.eventsBasedBehaviors;
eventsBasedObjects = other.eventsBasedObjects;
}
void EventsFunctionsExtension::SerializeTo(SerializerElement& element) const {
@@ -79,9 +81,17 @@ void EventsFunctionsExtension::SerializeTo(SerializerElement& element) const {
SerializeEventsFunctionsTo(element.AddChild("eventsFunctions"));
eventsBasedBehaviors.SerializeElementsTo(
"eventsBasedBehavior", element.AddChild("eventsBasedBehaviors"));
eventsBasedObjects.SerializeElementsTo(
"eventsBasedObject", element.AddChild("eventsBasedObjects"));
}
void EventsFunctionsExtension::UnserializeFrom(
gd::Project& project, const SerializerElement& element) {
UnserializeExtensionDeclarationFrom(project, element);
UnserializeExtensionImplementationFrom(project, element);
}
void EventsFunctionsExtension::UnserializeExtensionDeclarationFrom(
gd::Project& project, const SerializerElement& element) {
version = element.GetStringAttribute("version");
extensionNamespace = element.GetStringAttribute("extensionNamespace");
@@ -134,9 +144,48 @@ void EventsFunctionsExtension::UnserializeFrom(
dependencies.push_back(
UnserializeDependencyFrom(dependenciesElement.GetChild(i)));
// Only unserialize behaviors and objects names.
// As event based objects can contains objects using CustomBehavior and/or
// CustomObject, this allows them to reference EventBasedBehavior and
// EventBasedObject respectively.
auto &behaviorsElement = element.GetChild("eventsBasedBehaviors");
behaviorsElement.ConsiderAsArrayOf("eventsBasedBehavior");
for (std::size_t i = 0; i < behaviorsElement.GetChildrenCount(); ++i) {
const gd::String &behaviorName =
behaviorsElement.GetChild(i).GetStringAttribute("name");
eventsBasedBehaviors.InsertNew(behaviorName, eventsBasedBehaviors.GetCount());
}
auto &objectsElement = element.GetChild("eventsBasedObjects");
objectsElement.ConsiderAsArrayOf("eventsBasedObject");
for (std::size_t i = 0; i < objectsElement.GetChildrenCount(); ++i) {
const gd::String &objectName =
objectsElement.GetChild(i).GetStringAttribute("name");
eventsBasedObjects.InsertNew(objectName, eventsBasedObjects.GetCount());
}
}
void EventsFunctionsExtension::UnserializeExtensionImplementationFrom(
gd::Project& project,
const SerializerElement& element) {
UnserializeEventsFunctionsFrom(project, element.GetChild("eventsFunctions"));
eventsBasedBehaviors.UnserializeElementsFrom(
"eventsBasedBehavior", project, element.GetChild("eventsBasedBehaviors"));
auto &behaviorsElement = element.GetChild("eventsBasedBehaviors");
behaviorsElement.ConsiderAsArrayOf("eventsBasedBehavior");
for (std::size_t i = 0; i < behaviorsElement.GetChildrenCount(); ++i) {
const gd::String &behaviorName =
behaviorsElement.GetChild(i).GetStringAttribute("name");
if (eventsBasedBehaviors.Has(behaviorName)) {
eventsBasedBehaviors.Get(behaviorName).UnserializeFrom(project, behaviorsElement.GetChild(i));
}
}
auto &objectsElement = element.GetChild("eventsBasedObjects");
objectsElement.ConsiderAsArrayOf("eventsBasedObject");
for (std::size_t i = 0; i < objectsElement.GetChildrenCount(); ++i) {
const gd::String &objectName =
objectsElement.GetChild(i).GetStringAttribute("name");
if (eventsBasedObjects.Has(objectName)) {
eventsBasedObjects.Get(objectName).UnserializeFrom(project, objectsElement.GetChild(i));
}
}
}
bool EventsFunctionsExtension::IsExtensionLifecycleEventsFunction(

View File

@@ -10,6 +10,7 @@
#include "GDCore/Extensions/Metadata/DependencyMetadata.h"
#include "GDCore/Project/EventsBasedBehavior.h"
#include "GDCore/Project/EventsBasedObject.h"
#include "GDCore/Project/EventsFunctionsContainer.h"
#include "GDCore/String.h"
#include "GDCore/Tools/SerializableWithNameList.h"
@@ -145,6 +146,21 @@ class GD_CORE_API EventsFunctionsExtension : public EventsFunctionsContainer {
return eventsBasedBehaviors;
}
/**
* \brief Return a reference to the list of the events based objects.
*/
gd::SerializableWithNameList<EventsBasedObject>& GetEventsBasedObjects() {
return eventsBasedObjects;
}
/**
* \brief Return a const reference to the list of the events based objects.
*/
const gd::SerializableWithNameList<EventsBasedObject>&
GetEventsBasedObjects() const {
return eventsBasedObjects;
}
/**
* \brief Sets an extension origin. This method is not present since the
* beginning so the projects created before that will have extensions
@@ -200,10 +216,26 @@ class GD_CORE_API EventsFunctionsExtension : public EventsFunctionsContainer {
void SerializeTo(gd::SerializerElement& element) const;
/**
* \brief Load the EventsFunctionsExtension from the specified element
* \brief Load the EventsFunctionsExtension from the specified element.
*/
void UnserializeFrom(gd::Project& project,
const gd::SerializerElement& element);
/**
* \brief Load the extension without free functions, behaviors and objects
* implementation.
*/
void UnserializeExtensionDeclarationFrom(
gd::Project& project,
const gd::SerializerElement& element);
/**
* \brief Load free functions, behaviors and objects implementation
* (in opposition to load just their "declaration" by reading their name).
*/
void UnserializeExtensionImplementationFrom(
gd::Project& project,
const gd::SerializerElement& element);
///@}
/** \name Lifecycle event functions
@@ -255,6 +287,7 @@ class GD_CORE_API EventsFunctionsExtension : public EventsFunctionsContainer {
gd::String helpPath; ///< The relative path to the help for this extension in
///< the documentation (or an absolute URL).
gd::SerializableWithNameList<EventsBasedBehavior> eventsBasedBehaviors;
gd::SerializableWithNameList<EventsBasedObject> eventsBasedObjects;
std::vector<gd::DependencyMetadata> dependencies;
};

View File

@@ -11,9 +11,7 @@
#include "GDCore/Project/Project.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Tools/UUID/UUID.h"
#if defined(GD_IDE_ONLY)
#include "GDCore/Project/PropertyDescriptor.h"
#endif
namespace gd {
@@ -30,6 +28,7 @@ InitialInstance::InitialInstance()
width(0),
height(0),
locked(false),
sealed(false),
persistentUuid(UUID::MakeUuid4()) {}
void InitialInstance::UnserializeFrom(const SerializerElement& element) {
@@ -44,6 +43,7 @@ void InitialInstance::UnserializeFrom(const SerializerElement& element) {
SetZOrder(element.GetIntAttribute("zOrder", 0, "plan"));
SetLayer(element.GetStringAttribute("layer"));
SetLocked(element.GetBoolAttribute("locked", false));
SetSealed(element.GetBoolAttribute("sealed", false));
persistentUuid = element.GetStringAttribute("persistentUuid");
if (persistentUuid.empty()) ResetPersistentUuid();
@@ -83,7 +83,8 @@ void InitialInstance::SerializeTo(SerializerElement& element) const {
element.SetAttribute("customSize", HasCustomSize());
element.SetAttribute("width", GetCustomWidth());
element.SetAttribute("height", GetCustomHeight());
element.SetAttribute("locked", IsLocked());
if (IsLocked()) element.SetAttribute("locked", IsLocked());
if (IsSealed()) element.SetAttribute("sealed", IsSealed());
if (persistentUuid.empty()) persistentUuid = UUID::MakeUuid4();
element.SetStringAttribute("persistentUuid", persistentUuid);
@@ -112,7 +113,6 @@ InitialInstance& InitialInstance::ResetPersistentUuid() {
return *this;
}
#if defined(GD_IDE_ONLY)
std::map<gd::String, gd::PropertyDescriptor>
InitialInstance::GetCustomProperties(gd::Project& project, gd::Layout& layout) {
// Find an object
@@ -140,7 +140,6 @@ bool InitialInstance::UpdateCustomProperty(const gd::String& name,
return false;
}
#endif
double InitialInstance::GetRawDoubleProperty(const gd::String& name) const {
const auto& it = numberProperties.find(name);

View File

@@ -127,19 +127,31 @@ class GD_CORE_API InitialInstance {
void SetCustomHeight(double height_) { height = height_; }
/**
* \brief Return true if the instance is locked and cannot be selected by
* clicking on it in the IDE.
* \brief Return true if the instance is locked and cannot be moved in the IDE.
*/
bool IsLocked() const { return locked; };
/**
* \brief (Un)lock the initial instance.
*
* An instance which is locked cannot be selected by clicking on it in a
* layout editor canvas.
* An instance which is locked cannot be moved with actions in the IDE.
*/
void SetLocked(bool enable = true) { locked = enable; }
/**
* \brief Return true if the instance cannot be selected by clicking on it
* in the IDE (only applies if instance is also locked).
*/
bool IsSealed() const { return sealed; };
/**
* \brief (Un)seal the initial instance.
*
* An instance which is sealed cannot be selected by clicking on it in a
* layout editor canvas.
*/
void SetSealed(bool enable = true) { sealed = enable; }
///@}
/** \name Variable management
@@ -270,6 +282,7 @@ class GD_CORE_API InitialInstance {
double height; ///< Object custom height
gd::VariablesContainer initialVariables; ///< Instance specific variables
bool locked; ///< True if the instance is locked
bool sealed; ///< True if the instance is sealed
mutable gd::String persistentUuid; ///< A persistent random version 4 UUID, useful for hot reloading.
static gd::String*

View File

@@ -16,7 +16,6 @@
#include "GDCore/Extensions/Platform.h"
#include "GDCore/IDE/SceneNameMangler.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/BehaviorContent.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Project/InitialInstance.h"
#include "GDCore/Project/Layer.h"
@@ -33,7 +32,7 @@ using namespace std;
namespace gd {
gd::Layer Layout::badLayer;
gd::BehaviorContent Layout::badBehaviorContent("", "");
gd::BehaviorsSharedData Layout::badBehaviorSharedData("", "");
Layout::Layout(const Layout& other) { Init(other); }
@@ -51,9 +50,6 @@ Layout::Layout()
backgroundColorB(209),
stopSoundsOnStartup(true),
standardSortMethod(true),
oglFOV(90.0f),
oglZNear(1.0f),
oglZFar(500.0f),
disableInputWhenNotFocused(true),
profiler(NULL)
{
@@ -79,23 +75,23 @@ std::vector<gd::String> Layout::GetAllBehaviorSharedDataNames() const {
return allNames;
}
const gd::BehaviorContent& Layout::GetBehaviorSharedData(
const gd::BehaviorsSharedData& Layout::GetBehaviorSharedData(
const gd::String& behaviorName) const {
auto it = behaviorsSharedData.find(behaviorName);
if (it != behaviorsSharedData.end()) return *it->second;
return badBehaviorContent;
return badBehaviorSharedData;
}
gd::BehaviorContent& Layout::GetBehaviorSharedData(
gd::BehaviorsSharedData& Layout::GetBehaviorSharedData(
const gd::String& behaviorName) {
auto it = behaviorsSharedData.find(behaviorName);
if (it != behaviorsSharedData.end()) return *it->second;
return badBehaviorContent;
return badBehaviorSharedData;
}
const std::map<gd::String, std::unique_ptr<gd::BehaviorContent> >&
const std::map<gd::String, std::unique_ptr<gd::BehaviorsSharedData> >&
Layout::GetAllBehaviorSharedData() const {
return behaviorsSharedData;
}
@@ -197,20 +193,20 @@ void Layout::UpdateBehaviorsSharedData(gd::Project& project) {
std::vector<gd::String> objectBehaviors =
initialObjects[i]->GetAllBehaviorNames();
for (unsigned int j = 0; j < objectBehaviors.size(); ++j) {
auto& behaviorContent =
auto& behavior =
initialObjects[i]->GetBehavior(objectBehaviors[j]);
allBehaviorsTypes.push_back(behaviorContent.GetTypeName());
allBehaviorsNames.push_back(behaviorContent.GetName());
allBehaviorsTypes.push_back(behavior.GetTypeName());
allBehaviorsNames.push_back(behavior.GetName());
}
}
for (std::size_t i = 0; i < project.GetObjectsCount(); ++i) {
std::vector<gd::String> objectBehaviors =
project.GetObject(i).GetAllBehaviorNames();
for (std::size_t j = 0; j < objectBehaviors.size(); ++j) {
auto& behaviorContent =
auto& behavior =
project.GetObject(i).GetBehavior(objectBehaviors[j]);
allBehaviorsTypes.push_back(behaviorContent.GetTypeName());
allBehaviorsNames.push_back(behaviorContent.GetName());
allBehaviorsTypes.push_back(behavior.GetTypeName());
allBehaviorsNames.push_back(behavior.GetName());
}
}
@@ -222,19 +218,34 @@ void Layout::UpdateBehaviorsSharedData(gd::Project& project) {
if (behaviorsSharedData.find(name) != behaviorsSharedData.end()) continue;
const gd::BehaviorMetadata& behaviorMetadata =
gd::MetadataProvider::GetBehaviorMetadata(project.GetCurrentPlatform(),
allBehaviorsTypes[i]);
if (gd::MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) continue;
if (project.HasEventsBasedBehavior(allBehaviorsTypes[i])) {
// Events based behaviors don't have shared data yet.
auto sharedData =
gd::make_unique<gd::BehaviorsSharedData>(name, allBehaviorsTypes[i]);
sharedData->InitializeContent();
behaviorsSharedData[name] = std::move(sharedData);
}
else {
const gd::BehaviorMetadata& behaviorMetadata =
gd::MetadataProvider::GetBehaviorMetadata(
project.GetCurrentPlatform(),
allBehaviorsTypes[i]);
if (gd::MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
continue;
}
gd::BehaviorsSharedData* behaviorSharedData =
behaviorMetadata.GetSharedDataInstance();
if (!behaviorSharedData) continue;
gd::BehaviorsSharedData* behaviorsSharedDataBluePrint =
behaviorMetadata.GetSharedDataInstance();
if (!behaviorsSharedDataBluePrint) continue;
auto behaviorContent =
gd::make_unique<gd::BehaviorContent>(name, allBehaviorsTypes[i]);
behaviorSharedData->InitializeContent(behaviorContent->GetContent());
behaviorsSharedData[name] = std::move(behaviorContent);
auto sharedData =
gd::make_unique<gd::BehaviorsSharedData>(
*behaviorsSharedDataBluePrint);
sharedData->SetName(name);
sharedData->SetTypeName(allBehaviorsTypes[i]);
sharedData->InitializeContent();
behaviorsSharedData[name] = std::move(sharedData);
}
}
// Remove useless shared data:
@@ -260,17 +271,12 @@ void Layout::SerializeTo(SerializerElement& element) const {
element.SetAttribute("v", (int)GetBackgroundColorGreen());
element.SetAttribute("b", (int)GetBackgroundColorBlue());
element.SetAttribute("title", GetWindowDefaultTitle());
element.SetAttribute("oglFOV", oglFOV);
element.SetAttribute("oglZNear", oglZNear);
element.SetAttribute("oglZFar", oglZFar);
element.SetAttribute("standardSortMethod", standardSortMethod);
element.SetAttribute("stopSoundsOnStartup", stopSoundsOnStartup);
element.SetAttribute("disableInputWhenNotFocused",
disableInputWhenNotFocused);
#if defined(GD_IDE_ONLY)
editorSettings.SerializeTo(element.AddChild("uiSettings"));
#endif
GetObjectGroups().SerializeTo(element.AddChild("objectsGroups"));
GetVariables().SerializeTo(element.AddChild("variables"));
@@ -321,9 +327,6 @@ void Layout::UnserializeFrom(gd::Project& project,
element.GetIntAttribute("b"));
SetWindowDefaultTitle(
element.GetStringAttribute("title", "(No title)", "titre"));
oglFOV = element.GetDoubleAttribute("oglFOV");
oglZNear = element.GetDoubleAttribute("oglZNear");
oglZFar = element.GetDoubleAttribute("oglZFar");
standardSortMethod = element.GetBoolAttribute("standardSortMethod");
stopSoundsOnStartup = element.GetBoolAttribute("stopSoundsOnStartup");
disableInputWhenNotFocused =
@@ -364,20 +367,20 @@ void Layout::UnserializeFrom(gd::Project& project,
"Behavior"); // Compatibility with GD <= 4
gd::String name = sharedDataElement.GetStringAttribute("name", "", "Name");
auto behaviorContent = gd::make_unique<gd::BehaviorContent>(name, type);
auto behavior = gd::make_unique<gd::BehaviorsSharedData>(name, type);
// Compatibility with GD <= 4.0.98
// If there is only one child called "content" (in addition to "type" and
// "name"), it's the content of a JavaScript behavior. Move the content
// out of the "content" object (to put it directly at the root of the
// behavior shared data element).
if (sharedDataElement.HasChild("content")) {
behaviorContent->UnserializeFrom(sharedDataElement.GetChild("content"));
behavior->UnserializeFrom(sharedDataElement.GetChild("content"));
}
// end of compatibility code
else {
behaviorContent->UnserializeFrom(sharedDataElement);
behavior->UnserializeFrom(sharedDataElement);
}
behaviorsSharedData[name] = std::move(behaviorContent);
behaviorsSharedData[name] = std::move(behavior);
}
}
@@ -388,9 +391,6 @@ void Layout::Init(const Layout& other) {
backgroundColorB = other.backgroundColorB;
standardSortMethod = other.standardSortMethod;
title = other.title;
oglFOV = other.oglFOV;
oglZNear = other.oglZNear;
oglZFar = other.oglZFar;
stopSoundsOnStartup = other.stopSoundsOnStartup;
disableInputWhenNotFocused = other.disableInputWhenNotFocused;
initialInstances = other.initialInstances;
@@ -402,7 +402,7 @@ void Layout::Init(const Layout& other) {
behaviorsSharedData.clear();
for (const auto& it : other.behaviorsSharedData) {
behaviorsSharedData[it.first] =
std::unique_ptr<gd::BehaviorContent>(it.second->Clone());
gd::make_unique<gd::BehaviorsSharedData>(*(it.second->Clone()));
}
events = other.events;

View File

@@ -17,14 +17,12 @@
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/VariablesContainer.h"
#include "GDCore/String.h"
#if defined(GD_IDE_ONLY)
#include "GDCore/IDE/Dialogs/LayoutEditorCanvas/EditorSettings.h"
#endif
namespace gd {
class BaseEvent;
class Object;
class Project;
class BehaviorContent;
class InitialInstancesContainer;
} // namespace gd
class TiXmlElement;
@@ -131,7 +129,6 @@ class GD_CORE_API Layout : public ObjectsContainer {
*/
///@{
#if defined(GD_IDE_ONLY)
/**
* Get the events of the layout
*/
@@ -141,7 +138,7 @@ class GD_CORE_API Layout : public ObjectsContainer {
* Get the events of the layout
*/
gd::EventsList& GetEvents() { return events; }
#endif
///@}
/** \name Variable management
@@ -238,12 +235,10 @@ class GD_CORE_API Layout : public ObjectsContainer {
*/
void MoveLayer(std::size_t oldIndex, std::size_t newIndex);
#if defined(GD_IDE_ONLY)
/**
* \brief Serialize the layers.
*/
void SerializeLayersTo(SerializerElement& element) const;
#endif
/**
* \brief Unserialize the layers.
@@ -274,21 +269,21 @@ class GD_CORE_API Layout : public ObjectsContainer {
/**
* \brief Get the shared data stored for a behavior
*/
const gd::BehaviorContent& GetBehaviorSharedData(
const gd::BehaviorsSharedData& GetBehaviorSharedData(
const gd::String& behaviorName) const;
/**
* \brief Get the shared data stored for a behavior
*/
gd::BehaviorContent& GetBehaviorSharedData(const gd::String& behaviorName);
gd::BehaviorsSharedData& GetBehaviorSharedData(const gd::String& behaviorName);
/**
* \brief Get a map of all shared data stored for behaviors
*/
const std::map<gd::String, std::unique_ptr<gd::BehaviorContent>>&
const std::map<gd::String, std::unique_ptr<gd::BehaviorsSharedData>>&
GetAllBehaviorSharedData() const;
#if defined(GD_IDE_ONLY)
/**
* Return the settings associated to the layout.
* \see gd::EditorSettings
@@ -304,7 +299,6 @@ class GD_CORE_API Layout : public ObjectsContainer {
gd::EditorSettings& GetAssociatedEditorSettings() {
return editorSettings;
}
#endif
/** \name Other properties
*/
@@ -345,48 +339,16 @@ class GD_CORE_API Layout : public ObjectsContainer {
* launched
*/
bool StopSoundsOnStartup() const { return stopSoundsOnStartup; }
/**
* Set OpenGL default field of view
*/
void SetOpenGLFOV(float oglFOV_) { oglFOV = oglFOV_; }
/**
* Get OpenGL default field of view
*/
float GetOpenGLFOV() const { return oglFOV; }
/**
* Set OpenGL near clipping plan
*/
void SetOpenGLZNear(float oglZNear_) { oglZNear = oglZNear_; }
/**
* Get OpenGL near clipping plan
*/
float GetOpenGLZNear() const { return oglZNear; }
/**
* Set OpenGL far clipping plan
*/
void SetOpenGLZFar(float oglZFar_) { oglZFar = oglZFar_; }
/**
* Get OpenGL far clipping plan
*/
float GetOpenGLZFar() const { return oglZFar; }
///@}
/** \name Saving and loading
* Members functions related to saving and loading the object.
*/
///@{
#if defined(GD_IDE_ONLY)
/**
* \brief Serialize the layout.
*/
void SerializeTo(SerializerElement& element) const;
#endif
/**
* \brief Unserialize the layout.
@@ -395,7 +357,6 @@ class GD_CORE_API Layout : public ObjectsContainer {
///@}
// TODO: GD C++ Platform specific code below
#if defined(GD_IDE_ONLY)
/**
* Get the profiler associated with the scene. Can be NULL.
*/
@@ -405,7 +366,6 @@ class GD_CORE_API Layout : public ObjectsContainer {
* Set the profiler associated with the scene. Can be NULL.
*/
void SetProfiler(BaseProfiler* profiler_) { profiler = profiler_; };
#endif
private:
gd::String name; ///< Scene name
@@ -417,32 +377,27 @@ class GD_CORE_API Layout : public ObjectsContainer {
gd::VariablesContainer variables; ///< Variables list
gd::InitialInstancesContainer initialInstances; ///< Initial instances
std::vector<gd::Layer> initialLayers; ///< Initial layers
std::map<gd::String, std::unique_ptr<gd::BehaviorContent>>
std::map<gd::String, std::unique_ptr<gd::BehaviorsSharedData>>
behaviorsSharedData; ///< Initial shared datas of behaviors
bool stopSoundsOnStartup; ///< True to make the scene stop all sounds at
///< startup.
bool standardSortMethod; ///< True to sort objects using standard sort.
float oglFOV; ///< OpenGL Field Of View value
float oglZNear; ///< OpenGL Near Z position
float oglZFar; ///< OpenGL Far Z position
bool disableInputWhenNotFocused; /// If set to true, the input must be
/// disabled when the window do not have the
/// focus.
static gd::Layer badLayer; ///< Null object, returned when GetLayer can not
///< find an appropriate layer.
static gd::BehaviorContent
badBehaviorContent; ///< Null object, returned when
static gd::BehaviorsSharedData
badBehaviorSharedData; ///< Null object, returned when
///< GetBehaviorSharedData can not find the
///< specified behavior shared data.
#if defined(GD_IDE_ONLY)
EventsList events; ///< Scene events
gd::EditorSettings editorSettings;
#endif
// TODO: GD C++ Platform specific code below
#if defined(GD_IDE_ONLY)
BaseProfiler* profiler; ///< Pointer to the profiler. Can be NULL.
#endif
/**
* Initialize from another layout. Used by copy-ctor and assign-op.

View File

@@ -9,10 +9,12 @@
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/CustomBehavior.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/Tools/Log.h"
namespace gd {
@@ -30,7 +32,7 @@ void Object::Init(const gd::Object& object) {
behaviors.clear();
for (auto& it : object.behaviors) {
behaviors[it.first] = gd::make_unique<gd::BehaviorContent>(*it.second);
behaviors[it.first] = gd::make_unique<gd::Behavior>(*it.second);
}
}
@@ -49,7 +51,7 @@ bool Object::RenameBehavior(const gd::String& name, const gd::String& newName) {
behaviors.find(newName) != behaviors.end())
return false;
std::unique_ptr<BehaviorContent> aut =
std::unique_ptr<Behavior> aut =
std::move(behaviors.find(name)->second);
behaviors.erase(name);
behaviors[newName] = std::move(aut);
@@ -58,11 +60,11 @@ bool Object::RenameBehavior(const gd::String& name, const gd::String& newName) {
return true;
}
gd::BehaviorContent& Object::GetBehavior(const gd::String& name) {
gd::Behavior& Object::GetBehavior(const gd::String& name) {
return *behaviors.find(name)->second;
}
const gd::BehaviorContent& Object::GetBehavior(const gd::String& name) const {
const gd::Behavior& Object::GetBehavior(const gd::String& name) const {
return *behaviors.find(name)->second;
}
@@ -70,34 +72,41 @@ bool Object::HasBehaviorNamed(const gd::String& name) const {
return behaviors.find(name) != behaviors.end();
}
gd::BehaviorContent& Object::AddBehavior(
const gd::BehaviorContent& behaviorContent) {
const gd::String& behaviorName = behaviorContent.GetName();
auto newBehaviorContent =
gd::make_unique<gd::BehaviorContent>(behaviorContent);
behaviors[behaviorName] = std::move(newBehaviorContent);
return *behaviors[behaviorName];
}
std::map<gd::String, gd::PropertyDescriptor> Object::GetProperties() const {
std::map<gd::String, gd::PropertyDescriptor> nothing;
return nothing;
}
gd::BehaviorContent* Object::AddNewBehavior(const gd::Project& project,
gd::Behavior* Object::AddNewBehavior(const gd::Project& project,
const gd::String& type,
const gd::String& name) {
const gd::BehaviorMetadata& behaviorMetadata =
gd::MetadataProvider::GetBehaviorMetadata(project.GetCurrentPlatform(),
type);
if (gd::MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
return nullptr;
}
auto initializeAndAdd =
[this, &name](std::unique_ptr<gd::Behavior> behavior) {
behavior->InitializeContent();
this->behaviors[name] = std::move(behavior);
return this->behaviors[name].get();
};
auto behaviorContent = gd::make_unique<gd::BehaviorContent>(name, type);
behaviorMetadata.Get().InitializeContent(behaviorContent->GetContent());
behaviors[name] = std::move(behaviorContent);
return behaviors[name].get();
if (project.HasEventsBasedBehavior(type)) {
return initializeAndAdd(
gd::make_unique<CustomBehavior>(name, project, type));
}
else {
const gd::BehaviorMetadata& behaviorMetadata =
gd::MetadataProvider::GetBehaviorMetadata(project.GetCurrentPlatform(),
type);
if (gd::MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
gd::LogWarning("Tried to create a behavior with an unknown type: " + type
+ " on object " + GetName() + "!");
// It's probably an events-based object that was removed.
// Create a custom behavior to preserve the properties values.
return initializeAndAdd(
gd::make_unique<CustomBehavior>(name, project, type));
}
std::unique_ptr<gd::Behavior> behavior(behaviorMetadata.Get().Clone());
behavior->SetName(name);
return initializeAndAdd(std::move(behavior));
}
}
std::map<gd::String, gd::PropertyDescriptor>
@@ -133,9 +142,8 @@ void Object::UnserializeFrom(gd::Project& project,
.FindAndReplace("Automatism", "Behavior");
gd::String name = behaviorElement.GetStringAttribute("name", "", "Name");
auto behaviorContent = gd::make_unique<gd::BehaviorContent>(name, type);
behaviorContent->UnserializeFrom(behaviorElement);
behaviors[name] = std::move(behaviorContent);
auto behavior = gd::Object::AddNewBehavior(project, type, name);
behavior->UnserializeFrom(behaviorElement);
}
}
// End of compatibility code
@@ -151,7 +159,7 @@ void Object::UnserializeFrom(gd::Project& project,
"Automatism", "Behavior"); // Compatibility with GD <= 4
gd::String name = behaviorElement.GetStringAttribute("name");
auto behaviorContent = gd::make_unique<gd::BehaviorContent>(name, type);
auto behavior = gd::Object::AddNewBehavior(project, type, name);
// Compatibility with GD <= 4.0.98
// If there is only one child called "content" (in addition to "type" and
// "name"), it's the content of a JavaScript behavior. Move the content
@@ -169,13 +177,12 @@ void Object::UnserializeFrom(gd::Project& project,
contentElement.RemoveChild("type");
}
behaviorContent->UnserializeFrom(contentElement);
behavior->UnserializeFrom(contentElement);
}
// end of compatibility code
else {
behaviorContent->UnserializeFrom(behaviorElement);
behavior->UnserializeFrom(behaviorElement);
}
behaviors[name] = std::move(behaviorContent);
}
}
@@ -194,15 +201,15 @@ void Object::SerializeTo(SerializerElement& element) const {
behaviorsElement.ConsiderAsArrayOf("behavior");
std::vector<gd::String> allBehaviors = GetAllBehaviorNames();
for (std::size_t i = 0; i < allBehaviors.size(); ++i) {
const gd::BehaviorContent& behaviorContent = GetBehavior(allBehaviors[i]);
const gd::Behavior& behavior = GetBehavior(allBehaviors[i]);
SerializerElement& behaviorElement = behaviorsElement.AddChild("behavior");
behaviorContent.SerializeTo(behaviorElement);
behavior.SerializeTo(behaviorElement);
behaviorElement.RemoveChild("type"); // The content can contain type or
// name properties, remove them.
behaviorElement.RemoveChild("name");
behaviorElement.SetAttribute("type", behaviorContent.GetTypeName());
behaviorElement.SetAttribute("name", behaviorContent.GetName());
behaviorElement.SetAttribute("type", behavior.GetTypeName());
behaviorElement.SetAttribute("name", behavior.GetName());
}
DoSerializeTo(element);

View File

@@ -10,7 +10,7 @@
#include <memory>
#include <vector>
#include "GDCore/Project/BehaviorContent.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/EffectsContainer.h"
#include "GDCore/Project/VariablesContainer.h"
#include "GDCore/String.h"
@@ -208,12 +208,12 @@ class GD_CORE_API Object {
/**
* \brief Return a reference to the content of the behavior called \a name.
*/
BehaviorContent& GetBehavior(const gd::String& name);
Behavior& GetBehavior(const gd::String& name);
/**
* \brief Return a reference to the content of the behavior called \a name.
*/
const BehaviorContent& GetBehavior(const gd::String& name) const;
const Behavior& GetBehavior(const gd::String& name) const;
/**
* \brief Return true if object has a behavior called \a name.
@@ -231,13 +231,6 @@ class GD_CORE_API Object {
*/
bool RenameBehavior(const gd::String& name, const gd::String& newName);
/**
* \brief Add the specified behavior content to the object
*
* \return A reference to the newly added behavior content.
*/
gd::BehaviorContent& AddBehavior(const gd::BehaviorContent& behavior);
/**
* \brief Add the behavior of the specified \a type with the specified \a
* name.
@@ -247,15 +240,15 @@ class GD_CORE_API Object {
* \return A pointer to the newly added behavior content. NULL if the creation
* failed.
*/
gd::BehaviorContent* AddNewBehavior(const gd::Project& project,
const gd::String& type,
const gd::String& name);
gd::Behavior* AddNewBehavior(const gd::Project& project,
const gd::String& type,
const gd::String& name);
/**
* \brief Get a read-only access to the map containing the behaviors with
* their properties.
*/
const std::map<gd::String, std::unique_ptr<gd::BehaviorContent>>&
const std::map<gd::String, std::unique_ptr<gd::Behavior>>&
GetAllBehaviorContents() const {
return behaviors;
};
@@ -318,7 +311,7 @@ class GD_CORE_API Object {
gd::String assetStoreId; ///< The ID of the asset if the object comes from the store.
gd::String type; ///< Which type is the object. ( To test if we can do
///< something reserved to some objects with it )
std::map<gd::String, std::unique_ptr<gd::BehaviorContent>>
std::map<gd::String, std::unique_ptr<gd::Behavior>>
behaviors; ///< Contains all behaviors and their properties for the
///< object. Behavior contents are the ownership of the
///< object.

View File

@@ -83,7 +83,7 @@ gd::Object& ObjectsContainer::InsertNewObject(const gd::Project& project,
gd::Object& newlyCreatedObject = *(*(initialObjects.insert(
position < initialObjects.size() ? initialObjects.begin() + position
: initialObjects.end(),
project.GetCurrentPlatform().CreateObject(objectType, name))));
project.CreateObject(objectType, name))));
return newlyCreatedObject;
}

View File

@@ -23,6 +23,7 @@
#include "GDCore/IDE/PlatformManager.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/CustomObject.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/ExternalLayout.h"
#include "GDCore/Project/Layout.h"
@@ -79,22 +80,79 @@ Project::~Project() {}
void Project::ResetProjectUuid() { projectUuid = UUID::MakeUuid4(); }
std::unique_ptr<gd::Object> Project::CreateObject(
const gd::String& type,
const gd::String& name,
const gd::String& platformName) {
for (std::size_t i = 0; i < platforms.size(); ++i) {
if (!platformName.empty() && platforms[i]->GetName() != platformName)
continue;
std::unique_ptr<gd::Object> object = platforms[i]->CreateObject(
type, name); // Create a base object if the type can't be found in the
// platform
if (object && object->GetType() == type)
return object; // If the object is valid and has the good type (not a
// base object), return it
const gd::String& type,
const gd::String& name) const {
if (Project::HasEventsBasedObject(type)) {
return gd::make_unique<CustomObject>(name, *this, type);
}
else {
// Create a base object if the type can't be found in the platform.
return currentPlatform->CreateObject(type, name);
}
}
return nullptr;
bool Project::HasEventsBasedObject(const gd::String& type) const {
const auto separatorIndex = type.find(PlatformExtension::GetNamespaceSeparator());
if (separatorIndex == std::string::npos) {
return false;
}
gd::String extensionName = type.substr(0, separatorIndex);
if (!Project::HasEventsFunctionsExtensionNamed(extensionName)) {
return false;
}
auto &extension = Project::GetEventsFunctionsExtension(extensionName);
gd::String objectTypeName = type.substr(separatorIndex + 2);
return extension.GetEventsBasedObjects().Has(objectTypeName);
}
gd::EventsBasedObject& Project::GetEventsBasedObject(const gd::String& type) {
const auto separatorIndex = type.find(PlatformExtension::GetNamespaceSeparator());
gd::String extensionName = type.substr(0, separatorIndex);
gd::String objectTypeName = type.substr(separatorIndex + 2);
auto &extension = Project::GetEventsFunctionsExtension(extensionName);
return extension.GetEventsBasedObjects().Get(objectTypeName);
}
const gd::EventsBasedObject& Project::GetEventsBasedObject(const gd::String& type) const {
const auto separatorIndex = type.find(PlatformExtension::GetNamespaceSeparator());
gd::String extensionName = type.substr(0, separatorIndex);
gd::String objectTypeName = type.substr(separatorIndex + 2);
const auto &extension = Project::GetEventsFunctionsExtension(extensionName);
return extension.GetEventsBasedObjects().Get(objectTypeName);
}
bool Project::HasEventsBasedBehavior(const gd::String& type) const {
const auto separatorIndex = type.find(PlatformExtension::GetNamespaceSeparator());
if (separatorIndex == std::string::npos) {
return false;
}
gd::String extensionName = type.substr(0, separatorIndex);
if (!Project::HasEventsFunctionsExtensionNamed(extensionName)) {
return false;
}
auto &extension = Project::GetEventsFunctionsExtension(extensionName);
gd::String behaviorTypeName = type.substr(separatorIndex + 2);
return extension.GetEventsBasedBehaviors().Has(behaviorTypeName);
}
gd::EventsBasedBehavior& Project::GetEventsBasedBehavior(const gd::String& type) {
const auto separatorIndex = type.find(PlatformExtension::GetNamespaceSeparator());
gd::String extensionName = type.substr(0, separatorIndex);
gd::String behaviorTypeName = type.substr(separatorIndex + 2);
auto &extension = Project::GetEventsFunctionsExtension(extensionName);
return extension.GetEventsBasedBehaviors().Get(behaviorTypeName);
}
const gd::EventsBasedBehavior& Project::GetEventsBasedBehavior(const gd::String& type) const {
const auto separatorIndex = type.find(PlatformExtension::GetNamespaceSeparator());
gd::String extensionName = type.substr(0, separatorIndex);
gd::String behaviorTypeName = type.substr(separatorIndex + 2);
auto &extension = Project::GetEventsFunctionsExtension(extensionName);
return extension.GetEventsBasedBehaviors().Get(behaviorTypeName);
}
std::shared_ptr<gd::BaseEvent> Project::CreateEvent(
@@ -642,6 +700,38 @@ void Project::UnserializeFrom(const SerializerElement& element) {
if (currentPlatform == NULL && !platforms.empty())
currentPlatform = platforms.back();
eventsFunctionsExtensions.clear();
const SerializerElement& eventsFunctionsExtensionsElement =
element.GetChild("eventsFunctionsExtensions");
eventsFunctionsExtensionsElement.ConsiderAsArrayOf(
"eventsFunctionsExtension");
// First, only unserialize behaviors and objects names.
// As event based objects can contains CustomObject and Custom Object,
// this allows them to reference EventBasedBehavior and EventBasedObject
// respectively.
for (std::size_t i = 0;
i < eventsFunctionsExtensionsElement.GetChildrenCount();
++i) {
const SerializerElement& eventsFunctionsExtensionElement =
eventsFunctionsExtensionsElement.GetChild(i);
gd::EventsFunctionsExtension& newEventsFunctionsExtension =
InsertNewEventsFunctionsExtension("",
GetEventsFunctionsExtensionsCount());
newEventsFunctionsExtension.UnserializeExtensionDeclarationFrom(
*this, eventsFunctionsExtensionElement);
}
// Then unserialize functions, behaviors and objects content.
for (std::size_t i = 0;
i < eventsFunctionsExtensionsElement.GetChildrenCount();
++i) {
const SerializerElement& eventsFunctionsExtensionElement =
eventsFunctionsExtensionsElement.GetChild(i);
eventsFunctionsExtensions.at(i)->UnserializeExtensionImplementationFrom(
*this, eventsFunctionsExtensionElement);
}
GetObjectGroups().UnserializeFrom(
element.GetChild("objectsGroups", 0, "ObjectGroups"));
resourcesManager.UnserializeFrom(
@@ -676,24 +766,6 @@ void Project::UnserializeFrom(const SerializerElement& element) {
externalEvents.UnserializeFrom(*this, externalEventElement);
}
eventsFunctionsExtensions.clear();
const SerializerElement& eventsFunctionsExtensionsElement =
element.GetChild("eventsFunctionsExtensions");
eventsFunctionsExtensionsElement.ConsiderAsArrayOf(
"eventsFunctionsExtension");
for (std::size_t i = 0;
i < eventsFunctionsExtensionsElement.GetChildrenCount();
++i) {
const SerializerElement& eventsFunctionsExtensionElement =
eventsFunctionsExtensionsElement.GetChild(i);
gd::EventsFunctionsExtension& newEventsFunctionsExtension =
InsertNewEventsFunctionsExtension("",
GetEventsFunctionsExtensionsCount());
newEventsFunctionsExtension.UnserializeFrom(
*this, eventsFunctionsExtensionElement);
}
externalLayouts.clear();
const SerializerElement& externalLayoutsElement =
element.GetChild("externalLayouts", 0, "ExternalLayouts");

View File

@@ -24,6 +24,8 @@ class ExternalEvents;
class ResourcesManager;
class ExternalLayout;
class EventsFunctionsExtension;
class EventsBasedObject;
class EventsBasedBehavior;
class Object;
class VariablesContainer;
class ArbitraryResourceWorker;
@@ -455,20 +457,12 @@ class GD_CORE_API Project : public ObjectsContainer {
/**
* Create an object of the given type with the specified name.
*
* \note A project can use more than one platform. In this case, the first
* platform supporting the object is used, unless \a platformName argument is
* not empty.<br> It is assumed that each platform provides an equivalent
* object.
*
*
* \param type The type of the object
* \param name The name of the object
* \param platformName The name of the platform to be used. If empty, the
* first platform supporting the object is used.
*/
std::unique_ptr<gd::Object> CreateObject(const gd::String& type,
const gd::String& name,
const gd::String& platformName = "");
const gd::String& name) const;
/**
* Create an event of the given type.
@@ -827,6 +821,37 @@ class GD_CORE_API Project : public ObjectsContainer {
* \brief Remove all the events functions extensions.
*/
void ClearEventsFunctionsExtensions();
/**
* \brief Check if events based object with a given type exists.
*/
bool HasEventsBasedObject(const gd::String& type) const;
/**
* \brief Return the events based object with a given type.
*/
gd::EventsBasedObject& GetEventsBasedObject(const gd::String& type);
/**
* \brief Return the events based object with a given type.
*/
const gd::EventsBasedObject& GetEventsBasedObject(const gd::String& type) const;
/**
* \brief Check if events based behavior with a given type exists.
*/
bool HasEventsBasedBehavior(const gd::String& type) const;
/**
* \brief Return the events based behavior with a given type.
*/
gd::EventsBasedBehavior& GetEventsBasedBehavior(const gd::String& type);
/**
* \brief Return the events based behavior with a given type.
*/
const gd::EventsBasedBehavior& GetEventsBasedBehavior(const gd::String& type) const;
///@}
/** \name Resources management

View File

@@ -184,11 +184,17 @@ std::map<gd::String, gd::PropertyDescriptor> AudioResource::GetProperties()
const {
std::map<gd::String, gd::PropertyDescriptor> properties;
properties[_("Preload as sound")]
.SetDescription(_("Loads the fully decoded file into cache, so it can be played right away as Sound with no further delays."))
.SetValue(preloadAsSound ? "true" : "false")
.SetType("Boolean");
properties[_("Preload as music")]
.SetDescription(_("Prepares the file for immediate streaming as Music (does not wait for complete download)."))
.SetValue(preloadAsMusic ? "true" : "false")
.SetType("Boolean");
properties[_("Preload in cache")]
.SetDescription(_("Loads the complete file into cache, but does not decode it into memory until requested."))
.SetValue(preloadInCache ? "true" : "false")
.SetType("Boolean");
return properties;
}
@@ -199,6 +205,8 @@ bool AudioResource::UpdateProperty(const gd::String& name,
preloadAsSound = value == "1";
else if (name == _("Preload as music"))
preloadAsMusic = value == "1";
else if (name == _("Preload in cache"))
preloadInCache = value == "1";
return true;
}
@@ -569,6 +577,7 @@ void AudioResource::UnserializeFrom(const SerializerElement& element) {
SetFile(element.GetStringAttribute("file"));
SetPreloadAsMusic(element.GetBoolAttribute("preloadAsMusic"));
SetPreloadAsSound(element.GetBoolAttribute("preloadAsSound"));
SetPreloadInCache(element.GetBoolAttribute("preloadInCache"));
}
void AudioResource::SerializeTo(SerializerElement& element) const {
@@ -576,6 +585,7 @@ void AudioResource::SerializeTo(SerializerElement& element) const {
element.SetAttribute("file", GetFile());
element.SetAttribute("preloadAsMusic", PreloadAsMusic());
element.SetAttribute("preloadAsSound", PreloadAsSound());
element.SetAttribute("preloadInCache", PreloadInCache());
}
void FontResource::SetFile(const gd::String& newFile) {

View File

@@ -223,7 +223,7 @@ class GD_CORE_API ImageResource : public Resource {
*/
class GD_CORE_API AudioResource : public Resource {
public:
AudioResource() : Resource(), preloadAsMusic(false), preloadAsSound(false) {
AudioResource() : Resource(), preloadAsMusic(false), preloadAsSound(false), preloadInCache(false) {
SetKind("audio");
};
virtual ~AudioResource(){};
@@ -263,10 +263,21 @@ class GD_CORE_API AudioResource : public Resource {
*/
void SetPreloadAsSound(bool enable = true) { preloadAsSound = enable; }
/**
* \brief Return true if the audio resource should be preloaded in cache (without decoding into memory).
*/
bool PreloadInCache() const { return preloadInCache; }
/**
* \brief Set if the audio resource should be preloaded in cache (without decoding into memory).
*/
void SetPreloadInCache(bool enable = true) { preloadInCache = enable; }
private:
gd::String file;
bool preloadAsSound;
bool preloadAsMusic;
bool preloadInCache;
};
/**

View File

@@ -22,7 +22,7 @@ namespace gd {
* properties).
*
* It is used for serialization (to JSON or XML), or as a generic
* container for properties of objects (see for example gd::BehaviorContent).
* container for properties of objects (see for example gd::Behavior).
*
* It also has specialized methods in GDevelop.js (see postjs.js) to be
* converted to a JavaScript object.

View File

@@ -19,6 +19,8 @@
#include "GDCore/Tools/VersionWrapper.h"
#include "catch.hpp"
// TODO: Add some tests on layouts and behavior shared data.
TEST_CASE("Project", "[common]") {
SECTION("Basics") {
gd::Project project;

View File

@@ -12,9 +12,12 @@
#include "GDCore/Tools/Localization.h"
#include "catch.hpp"
// TODO Remove these 2 classes and write the test with events based behaviors.
class BehaviorWithRequiredBehaviorProperty : public gd::Behavior {
public:
BehaviorWithRequiredBehaviorProperty(){};
BehaviorWithRequiredBehaviorProperty(
const gd::String& name, const gd::String& type)
: Behavior(name, type) {};
virtual ~BehaviorWithRequiredBehaviorProperty(){};
virtual Behavior* Clone() const override {
return new BehaviorWithRequiredBehaviorProperty(*this);
@@ -49,7 +52,9 @@ class BehaviorWithRequiredBehaviorProperty : public gd::Behavior {
class BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior
: public gd::Behavior {
public:
BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior(){};
BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior(
const gd::String& name, const gd::String& type)
: Behavior(name, type) {};
virtual ~BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior(){};
virtual Behavior* Clone() const override {
return new BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior(
@@ -260,10 +265,11 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
"Dummy behavior",
"MyBehavior",
"A dummy behavior for tests",
"",
"",
"",
gd::make_unique<gd::Behavior>(),
"Group",
"Icon.png",
"MyBehavior",
gd::make_unique<gd::Behavior>(
"Behavior", "MyExtension::MyBehavior"),
gd::make_unique<gd::BehaviorsSharedData>());
behavior
.AddAction("BehaviorDoSomething",
@@ -304,10 +310,11 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
"Another Dummy behavior",
"MyOtherBehavior",
"Another dummy behavior for tests",
"",
"",
"",
gd::make_unique<gd::Behavior>(),
"Group",
"Icon.png",
"MyOtherBehavior",
gd::make_unique<gd::Behavior>(
"Behavior", "MyExtension::MyOtherBehavior"),
gd::make_unique<gd::BehaviorsSharedData>());
}
@@ -317,10 +324,11 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
"BehaviorWithRequiredBehaviorProperty",
"BehaviorWithRequiredBehaviorProperty",
"A dummy behavior requiring another behavior (MyBehavior)",
"",
"",
"",
gd::make_unique<BehaviorWithRequiredBehaviorProperty>(),
"Group",
"Icon.png",
"BehaviorWithRequiredBehaviorProperty",
gd::make_unique<BehaviorWithRequiredBehaviorProperty>(
"Behavior", "MyExtension::BehaviorWithRequiredBehaviorProperty"),
gd::make_unique<gd::BehaviorsSharedData>());
}
{
@@ -331,11 +339,13 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
"A dummy behavior requiring another behavior "
"(BehaviorWithRequiredBehaviorProperty) that itself requires another "
"behavior (MyBehavior)",
"",
"",
"",
"Group",
"Icon.png",
"BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior",
gd::make_unique<
BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior>(),
BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior>(
"Behavior",
"MyExtension::BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior"),
gd::make_unique<gd::BehaviorsSharedData>());
}

View File

@@ -0,0 +1,207 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
/**
* @file Tests covering serialization to JSON.
*/
#include "DummyPlatform.h"
#include "GDCore/CommonTools.h"
#include "GDCore/Events/Builtin/StandardEvent.h"
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Events/Serialization.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/Variable.h"
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/Tools/SystemStats.h"
#include "GDCore/Tools/VersionWrapper.h"
#include "catch.hpp"
using namespace gd;
namespace {
void AddEventsBasedExtension(gd::Project &project) {
auto &eventsExtension =
project.InsertNewEventsFunctionsExtension("MyEventsExtension", 0);
auto &eventsBasedBehavior =
eventsExtension.GetEventsBasedBehaviors().InsertNew(
"MyEventsBasedBehavior", 0);
eventsBasedBehavior.SetFullName("My events based behavior");
eventsBasedBehavior.SetDescription("An events based behavior for test");
eventsBasedBehavior.SetObjectType("");
eventsBasedBehavior.GetPropertyDescriptors()
.InsertNew("MyProperty", 0)
.SetType("Number");
};
void AddAnotherEventsBasedExtensionWithDependency(gd::Project &project) {
auto &eventsExtension =
project.InsertNewEventsFunctionsExtension("MyOtherEventsExtension", 0);
auto &eventsBasedObject = eventsExtension.GetEventsBasedObjects().InsertNew(
"MyEventsBasedObject", 0);
eventsBasedObject.SetFullName("My events based object");
eventsBasedObject.SetDescription("An events based object for test");
gd::Object &object = eventsBasedObject.InsertNewObject(
project, "MyExtension::Sprite", "MyObject", 0);
gd::Behavior *behavior =
object.AddNewBehavior(project, "MyEventsExtension::MyEventsBasedBehavior",
"MyEventsBasedBehavior");
behavior->UpdateProperty("MyProperty", "481516");
};
void SetupProject(gd::Project &project, gd::Platform &platform) {
SetupProjectWithDummyPlatform(project, platform);
AddEventsBasedExtension(project);
gd::Layout &layout = project.InsertNewLayout("Scene", 0);
gd::Object &object =
layout.InsertNewObject(project, "MyExtension::Sprite", "MyObject", 0);
gd::Behavior *behavior =
object.AddNewBehavior(project, "MyEventsExtension::MyEventsBasedBehavior",
"MyEventsBasedBehavior");
behavior->UpdateProperty("MyProperty", "481516");
};
void CheckBehaviorPropertyInObjectContainerElement(
SerializerElement &objectContainerElement) {
REQUIRE(objectContainerElement.HasChild("objects"));
auto &objectsElement = objectContainerElement.GetChild("objects");
objectsElement.ConsiderAsArrayOf("object");
REQUIRE(objectsElement.GetChildrenCount() == 1);
auto &objectElement = objectsElement.GetChild(0);
REQUIRE(objectElement.GetStringAttribute("name") == "MyObject");
REQUIRE(objectElement.GetStringAttribute("type") == "MyExtension::Sprite");
REQUIRE(objectElement.HasChild("behaviors"));
auto &behaviorsElement = objectElement.GetChild("behaviors");
behaviorsElement.ConsiderAsArrayOf("behavior");
REQUIRE(behaviorsElement.GetChildrenCount() == 1);
auto &behaviorElement = behaviorsElement.GetChild(0);
REQUIRE(behaviorElement.GetStringAttribute("name") ==
"MyEventsBasedBehavior");
REQUIRE(behaviorElement.GetStringAttribute("type") ==
"MyEventsExtension::MyEventsBasedBehavior");
REQUIRE(behaviorElement.GetStringAttribute("MyProperty") == "481516");
};
void CheckBehaviorPropertyInElement(SerializerElement &projectElement) {
auto &layoutsElement = projectElement.GetChild("layouts");
layoutsElement.ConsiderAsArrayOf("layout");
REQUIRE(layoutsElement.GetChildrenCount() == 1);
auto &layoutElement = layoutsElement.GetChild(0);
REQUIRE(layoutElement.GetStringAttribute("name") == "Scene");
CheckBehaviorPropertyInObjectContainerElement(layoutElement);
};
void CheckBehaviorProperty(ObjectsContainer &container) {
auto &object = container.GetObject("MyObject");
REQUIRE(object.GetType() == "MyExtension::Sprite");
REQUIRE(object.HasBehaviorNamed("MyEventsBasedBehavior"));
auto &behavior = object.GetBehavior("MyEventsBasedBehavior");
REQUIRE(behavior.GetTypeName() == "MyEventsExtension::MyEventsBasedBehavior");
REQUIRE(behavior.GetProperties().size() == 1);
REQUIRE(behavior.GetProperties().at("MyProperty").GetValue() == "481516");
};
} // namespace
TEST_CASE("ProjectSerialization", "[common]") {
SECTION("Save and load a project with a custom behavior property value") {
gd::Platform platform;
gd::Project writtenProject;
SetupProject(writtenProject, platform);
SerializerElement projectElement;
writtenProject.SerializeTo(projectElement);
CheckBehaviorPropertyInElement(projectElement);
gd::Project readProject;
readProject.AddPlatform(platform);
readProject.UnserializeFrom(projectElement);
CheckBehaviorProperty(readProject.GetLayout("Scene"));
}
SECTION("Load a project with a property value on a custom behavior that no longer exists") {
gd::Platform platform;
gd::Project writtenProject;
SetupProject(writtenProject, platform);
// Remove the events-based behavior
writtenProject.RemoveEventsFunctionsExtension("MyEventsExtension");
SerializerElement projectElement;
writtenProject.SerializeTo(projectElement);
CheckBehaviorPropertyInElement(projectElement);
gd::Project readProject;
readProject.AddPlatform(platform);
readProject.UnserializeFrom(projectElement);
// Add the events-based behavior back
AddEventsBasedExtension(readProject);
CheckBehaviorProperty(readProject.GetLayout("Scene"));
}
SECTION("Save and load a project with an event based extension dependency") {
gd::Platform platform;
gd::Project writtenProject;
SetupProject(writtenProject, platform);
AddAnotherEventsBasedExtensionWithDependency(writtenProject);
// It's important that the extension with the dependency is the first one.
REQUIRE(writtenProject.GetEventsFunctionsExtension(0).GetName() ==
"MyOtherEventsExtension");
REQUIRE(writtenProject.GetEventsFunctionsExtension(1).GetName() ==
"MyEventsExtension");
SerializerElement projectElement;
writtenProject.SerializeTo(projectElement);
auto &extensionsElement =
projectElement.GetChild("eventsFunctionsExtensions");
extensionsElement.ConsiderAsArrayOf("eventsFunctionsExtension");
REQUIRE(extensionsElement.GetChildrenCount() == 2);
auto &firstExtensionElement = extensionsElement.GetChild(0);
REQUIRE(firstExtensionElement.GetStringAttribute("name") ==
"MyOtherEventsExtension");
auto &eventsBasedObjectsElement =
firstExtensionElement.GetChild("eventsBasedObjects");
eventsBasedObjectsElement.ConsiderAsArrayOf("eventsBasedObject");
auto &eventsBasedObjectElement =
eventsBasedObjectsElement.GetChild(0);
CheckBehaviorPropertyInObjectContainerElement(eventsBasedObjectElement);
auto &secondExtensionElement = extensionsElement.GetChild(1);
REQUIRE(secondExtensionElement.GetStringAttribute("name") ==
"MyEventsExtension");
gd::Project readProject;
readProject.AddPlatform(platform);
readProject.UnserializeFrom(projectElement);
// The custom behavior is unserialized even though it depends on the other
// extension.
REQUIRE(readProject.HasEventsBasedObject(
"MyOtherEventsExtension::MyEventsBasedObject"));
CheckBehaviorProperty(readProject.GetEventsBasedObject(
"MyOtherEventsExtension::MyEventsBasedObject"));
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -58,7 +58,7 @@ module.exports = {
.setName('AdMob Cordova plugin')
.setDependencyType('cordova')
.setExportName('gdevelop-cordova-admob-plus')
.setVersion('0.43.0')
.setVersion('0.45.0')
.setExtraSetting(
'APP_ID_ANDROID',
new gd.PropertyDescriptor('AdMobAppIdAndroid').setType(

View File

@@ -34,7 +34,6 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
std::make_shared<DestroyOutsideBehavior>(),
std::shared_ptr<gd::BehaviorsSharedData>());
#if defined(GD_IDE_ONLY)
aut.AddCondition("ExtraBorder",
_("Additional border"),
_("Compare the additional border that the object must cross "
@@ -47,8 +46,7 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "DestroyOutside")
.UseStandardRelationalOperatorParameters("number")
.MarkAsAdvanced()
.SetFunctionName("GetExtraBorder")
.SetIncludeFile("DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.h");
.SetFunctionName("GetExtraBorder");
aut.AddAction("ExtraBorder",
_("Additional border"),
@@ -63,7 +61,5 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
.UseStandardOperatorParameters("number")
.MarkAsAdvanced()
.SetFunctionName("SetExtraBorder")
.SetGetter("GetExtraBorder")
.SetIncludeFile("DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.h");
#endif
.SetGetter("GetExtraBorder");
}

View File

@@ -1786,7 +1786,7 @@ module.exports = {
'FirestoreHasDocument',
_("Check for a document's existence"),
_(
'Checks for the existence of a document. Sets the result variable to 1 if it exists else to 2.'
'Checks for the existence of a document. Sets the result variable to true if it exists else to false.'
),
_(
'Check for existence of _PARAM1_ in collection _PARAM0_ and store result in _PARAM2_ (store result state in _PARAM3_)'

View File

@@ -24,7 +24,6 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddInstructionOrExpressionGroupMetadata(_("Inventories"))
.SetIcon("CppPlatform/Extensions/Inventoryicon.png");
#if defined(GD_IDE_ONLY)
extension
.AddAction("Add",
_("Add an item"),
@@ -37,8 +36,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.SetFunctionName("InventoryTools::Add")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::Add");
extension
.AddAction("Remove",
@@ -52,8 +50,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.SetFunctionName("InventoryTools::Remove")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::Remove");
extension
.AddCondition("Count",
@@ -68,8 +65,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("InventoryTools::Count")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::Count");
extension
.AddCondition("Has",
@@ -84,8 +80,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.SetFunctionName("InventoryTools::Has")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::Has");
extension
.AddAction("SetMaximum",
@@ -103,8 +98,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.AddParameter("expression", _("Maximum count"))
.SetFunctionName("InventoryTools::SetMaximum")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::SetMaximum");
extension
.AddAction("SetUnlimited",
@@ -121,8 +115,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.AddParameter("yesorno", _("Allow an unlimited amount?"))
.SetFunctionName("InventoryTools::SetUnlimited")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::SetUnlimited");
extension
.AddCondition("IsFull",
@@ -137,8 +130,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.SetFunctionName("InventoryTools::Has")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::Has");
extension
.AddAction("Equip",
@@ -154,8 +146,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.AddParameter("yesorno", _("Equip?"))
.SetFunctionName("InventoryTools::Equip")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::Equip");
extension
.AddCondition("IsEquipped",
@@ -169,8 +160,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.SetFunctionName("InventoryTools::IsEquipped")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::IsEquipped");
extension
.AddAction("SerializeToVariable",
@@ -185,8 +175,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("scenevar", _("Scene variable"))
.SetFunctionName("InventoryTools::SerializeToVariable")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::SerializeToVariable");
extension
.AddAction("UnserializeFromVariable",
@@ -200,8 +189,7 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("scenevar", _("Scene variable"))
.SetFunctionName("InventoryTools::UnserializeFromVariable")
.SetIncludeFile("Inventory/InventoryTools.h");
.SetFunctionName("InventoryTools::UnserializeFromVariable");
extension
.AddExpression("Count",
@@ -212,7 +200,5 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.SetFunctionName("InventoryTools::Count")
.SetIncludeFile("Inventory/InventoryTools.h");
#endif
.SetFunctionName("InventoryTools::Count");
}

View File

@@ -44,7 +44,7 @@ module.exports = {
_('Save player score'),
_("Save the player's score to the given leaderboard."),
_(
'Send to leaderboard _PARAM1_ the score _PARAM2_ with player name: _PARAM3_.'
'Send to leaderboard _PARAM1_ the score _PARAM2_ with player name: _PARAM3_'
),
_('Save score'),
'JsPlatform/Extensions/leaderboard.svg',

View File

@@ -28,8 +28,6 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
extension.AddInstructionOrExpressionGroupMetadata(_("Linked objects"))
.SetIcon("CppPlatform/Extensions/LinkedObjectsicon24.png");
#if defined(GD_IDE_ONLY)
extension
.AddAction("LinkObjects",
_("Link two objects"),
@@ -44,8 +42,7 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
.AddParameter("objectPtr", _("Object 1"))
.AddParameter("objectPtr", _("Object 2"))
.SetFunctionName("GDpriv::LinkedObjects::LinkObjects")
.SetIncludeFile("LinkedObjects/LinkedObjectsTools.h");
.SetFunctionName("GDpriv::LinkedObjects::LinkObjects");
extension
.AddAction("RemoveLinkBetween",
@@ -60,8 +57,7 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
.AddParameter("objectPtr", _("Object 1"))
.AddParameter("objectPtr", _("Object 2"))
.SetFunctionName("GDpriv::LinkedObjects::RemoveLinkBetween")
.SetIncludeFile("LinkedObjects/LinkedObjectsTools.h");
.SetFunctionName("GDpriv::LinkedObjects::RemoveLinkBetween");
extension
.AddAction("RemoveAllLinksOf",
@@ -75,8 +71,7 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectPtr", _("Object"))
.SetFunctionName("GDpriv::LinkedObjects::RemoveAllLinksOf")
.SetIncludeFile("LinkedObjects/LinkedObjectsTools.h");
.SetFunctionName("GDpriv::LinkedObjects::RemoveAllLinksOf");
extension
.AddCondition("PickObjectsLinkedTo",
@@ -94,8 +89,7 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
.AddParameter("objectPtr", _("...if they are linked to this object"))
.AddCodeOnlyParameter("eventsFunctionContext", "")
.SetFunctionName("GDpriv::LinkedObjects::PickObjectsLinkedTo")
.SetIncludeFile("LinkedObjects/LinkedObjectsTools.h");
.SetFunctionName("GDpriv::LinkedObjects::PickObjectsLinkedTo");
extension
.AddAction(
@@ -112,8 +106,5 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
.AddParameter("objectPtr", _("...if they are linked to this object"))
.AddCodeOnlyParameter("eventsFunctionContext", "")
.SetFunctionName("GDpriv::LinkedObjects::PickObjectsLinkedTo")
.SetIncludeFile("LinkedObjects/LinkedObjectsTools.h");
#endif
.SetFunctionName("GDpriv::LinkedObjects::PickObjectsLinkedTo");
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -14,8 +14,11 @@ namespace gdjs {
data: string;
};
const isValidNetworkEvent = (event): event is NetworkEvent =>
typeof event.eventName === 'string' && typeof event.data === 'string';
const isValidNetworkEvent = (event: unknown): event is NetworkEvent =>
typeof event === 'object' &&
event !== null &&
typeof event['eventName'] === 'string' &&
typeof event['data'] === 'string';
/**
* The data bound to an event that got triggered.
@@ -41,7 +44,7 @@ namespace gdjs {
* An event that can be listened to.
*/
class Event {
private data: EventData[] = [];
private readonly data: EventData[] = [];
public dataloss = false;
/**
@@ -99,13 +102,13 @@ namespace gdjs {
/**
* All connected p2p clients, keyed by their ID.
*/
const connections: Record<string, Peer.DataConnection<NetworkEvent>> = {};
const connections = new Map<string, Peer.DataConnection<NetworkEvent>>();
/**
* Contains a map of events triggered by other p2p clients.
* It is keyed by the event name.
*/
const events: Record<string, Event> = {};
const events = new Map<string, Event>();
/**
* True if PeerJS is initialized and ready.
@@ -148,7 +151,7 @@ namespace gdjs {
});
peer.on('error', (errorMessage) => {
error = true;
lastError = errorMessage;
lastError = errorMessage.message;
});
peer.on('connection', (connection) => {
connection.on('open', () => {
@@ -168,7 +171,7 @@ namespace gdjs {
* @param connection The DataConnection of the peer
*/
const _onConnection = (connection: Peer.DataConnection<NetworkEvent>) => {
connections[connection.peer] = connection;
connections.set(connection.peer, connection);
connection.on('data', (data) => {
if (isValidNetworkEvent(data))
getEvent(data.eventName).pushData(
@@ -205,17 +208,18 @@ namespace gdjs {
* @param connectionID The ID of the peer that disconnected.
*/
const _onDisconnect = (connectionID: string) => {
if (!connections.hasOwnProperty(connectionID)) return;
if (!connections.has(connectionID)) return;
disconnectedPeers.push(connectionID);
delete connections[connectionID];
connections.delete(connectionID);
};
/**
* Get an event or creates it if it doesn't exist.
* Get an event, and creates it if it doesn't exist.
*/
export const getEvent = (name: string) => {
if (!events.hasOwnProperty(name)) events[name] = new Event();
return events[name];
export const getEvent = (name: string): Event => {
let event = events.get(name);
if (!event) events.set(name, (event = new Event()));
return event;
};
/**
@@ -235,14 +239,15 @@ namespace gdjs {
* @param id - The other client's ID.
*/
export const disconnectFromPeer = (id: string) => {
if (connections[id]) connections[id].close();
const connection = connections.get(id);
if (connection) connection.close();
};
/**
* Disconnects from all other p2p clients.
*/
export const disconnectFromAllPeers = () => {
for (const connection of Object.values(connections)) connection.close();
for (const connection of connections.values()) connection.close();
};
/**
@@ -289,8 +294,9 @@ namespace gdjs {
eventName: string,
eventData: string
) => {
if (connections[id]) {
connections[id].send({
const connection = connections.get(id);
if (connection) {
connection.send({
eventName: eventName,
data: eventData,
});
@@ -303,7 +309,11 @@ namespace gdjs {
* @param [eventData] - Additional data to send with the event.
*/
export const sendDataToAll = (eventName: string, eventData: string) => {
for (const id in connections) sendDataTo(id, eventName, eventData);
for (const connection of connections.values())
connection.send({
eventName: eventName,
data: eventData,
});
};
/**
@@ -471,10 +481,17 @@ namespace gdjs {
*/
export const getConnectedPeer = (): string => connectedPeers[0] || '';
/**
* A JavaScript-only function to get the raw P2P DataConnection.
* This can be useful for example when you want to use a binary protocol
* instead of GDevelop variables for high-performance networking.
*/
export const getConnectionInstance = (peerID: string) =>
connections.get(peerID);
gdjs.callbacksRuntimeScenePostEvents.push(() => {
for (const eventName in events) {
if (!events.hasOwnProperty(eventName)) continue;
events[eventName].popData();
for (const event of events.values()) {
event.popData();
}
if (disconnectedPeers.length > 0) {
disconnectedPeers.shift();

View File

@@ -149,7 +149,7 @@ module.exports = {
'JsPlatform/Extensions/p2picon.svg'
)
.addParameter('string', _('Host'), '', false)
.addParameter('number', _('Port'), '', false)
.addParameter('expression', _('Port'), '', false)
.addParameter('string', _('Path'), '', false)
.addParameter('string', _('Key'), '', false)
.addParameter('yesorno', _('SSl enabled?'), '', false)

View File

@@ -1,205 +1,138 @@
// Type definitions for the PeerJS class module
// Original definitions by Toshiya Nakakura <https://github.com/nakakura>
// at https://github.com/DefinitelyTyped/DefinitelyTyped
declare class Peer<T> {
prototype: RTCIceServer;
/**
* Minimal `EventEmitter` interface that is molded against the Node.js
* `EventEmitter` interface.
*/
declare class EventEmitter<
EventTypes extends EventEmitter.ValidEventTypes = string | symbol,
Context extends any = any
> {
static prefixed: string | boolean;
/**
* A peer can connect to other peers and listen for connections.
* @param id Other peers can connect to this peer using the provided ID.
* If no ID is given, one will be generated by the brokering server.
* @param options for specifying details about PeerServer
* Return an array listing the events for which the emitter has registered
* listeners.
*/
constructor(id?: string, options?: Peer.PeerJSOption);
eventNames(): Array<EventEmitter.EventNames<EventTypes>>;
/**
* A peer can connect to other peers and listen for connections.
* @param options for specifying details about PeerServer
* Return the listeners registered for a given event.
*/
constructor(options: Peer.PeerJSOption);
listeners<T extends EventEmitter.EventNames<EventTypes>>(
event: T
): Array<EventEmitter.EventListener<EventTypes, T>>;
/**
* Connects to the remote peer specified by id and returns a data connection.
* @param id The brokering ID of the remote peer (their peer.id).
* @param options for specifying details about Peer Connection
* Return the number of listeners listening to a given event.
*/
connect(id: string, options?: Peer.PeerConnectOption): Peer.DataConnection<T>;
/**
* Calls the remote peer specified by id and returns a media connection.
* @param id The brokering ID of the remote peer (their peer.id).
* @param stream The caller's media stream
* @param options Metadata associated with the connection, passed in by whoever initiated the connection.
*/
call(
id: string,
stream: MediaStream,
options?: Peer.CallOption
): Peer.MediaConnection;
/**
* Set listeners for peer events.
* @param event Event name
* @param cb Callback Function
*/
on(event: string, cb: () => void): void;
/**
* Emitted when a connection to the PeerServer is established.
* @param event Event name
* @param cb id is the brokering ID of the peer
*/
on(event: 'open', cb: (id: string) => void): void;
/**
* Emitted when a new data connection is established from a remote peer.
* @param event Event name
* @param cb Callback Function
*/
on(
event: 'connection',
cb: (dataConnection: Peer.DataConnection<T>) => void
): void;
/**
* Emitted when a remote peer attempts to call you.
* @param event Event name
* @param cb Callback Function
*/
on(event: 'call', cb: (mediaConnection: Peer.MediaConnection) => void): void;
/**
* Emitted when the peer is destroyed and can no longer accept or create any new connections.
* @param event Event name
* @param cb Callback Function
*/
on(event: 'close', cb: () => void): void;
/**
* Emitted when the peer is disconnected from the signalling server
* @param event Event name
* @param cb Callback Function
*/
on(event: 'disconnected', cb: () => void): void;
/**
* Errors on the peer are almost always fatal and will destroy the peer.
* @param event Event name
* @param cb Callback Function
*/
on(event: 'error', cb: (err: any) => void): void;
/**
* Remove event listeners.(EventEmitter3)
* @param {String} event The event we want to remove.
* @param {Function} fn The listener that we need to find.
* @param {Boolean} once Only remove once listeners.
*/
off(event: string, fn: Function, once?: boolean): void;
/**
* Close the connection to the server, leaving all existing data and media connections intact.
*/
disconnect(): void;
/**
* Attempt to reconnect to the server with the peer's old ID
*/
reconnect(): void;
/**
* Close the connection to the server and terminate all existing connections.
*/
destroy(): void;
listenerCount(event: EventEmitter.EventNames<EventTypes>): number;
/**
* Retrieve a data/media connection for this peer.
* @param peerId
* @param connectionId
* Calls each of the listeners registered for a given event.
*/
getConnection(
peerId: string,
connectionId: string
): Peer.MediaConnection | Peer.DataConnection<T> | null;
emit<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
...args: EventEmitter.EventArgs<EventTypes, T>
): boolean;
/**
* Get a list of available peer IDs
* @param callback
* Add a listener for a given event.
*/
listAllPeers(callback: (peerIds: Array<string>) => void): void;
on<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn: EventEmitter.EventListener<EventTypes, T>,
context?: Context
): this;
addListener<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn: EventEmitter.EventListener<EventTypes, T>,
context?: Context
): this;
/**
* The brokering ID of this peer
* Add a one-time listener for a given event.
*/
id: string;
once<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn: EventEmitter.EventListener<EventTypes, T>,
context?: Context
): this;
/**
* A hash of all connections associated with this peer, keyed by the remote peer's ID.
* Remove the listeners of a given event.
*/
connections: any;
removeListener<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn?: EventEmitter.EventListener<EventTypes, T>,
context?: Context,
once?: boolean
): this;
off<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn?: EventEmitter.EventListener<EventTypes, T>,
context?: Context,
once?: boolean
): this;
/**
* false if there is an active connection to the PeerServer.
* Remove all listeners, or those of the specified event.
*/
disconnected: boolean;
removeAllListeners(event?: EventEmitter.EventNames<EventTypes>): this;
}
declare namespace EventEmitter {
export interface ListenerFn<Args extends any[] = any[]> {
(...args: Args): void;
}
export interface EventEmitterStatic {
new <
EventTypes extends ValidEventTypes = string | symbol,
Context = any
>(): EventEmitter<EventTypes, Context>;
}
/**
* true if this peer and all of its connections can no longer be used.
* `object` should be in either of the following forms:
* ```
* interface EventTypes {
* 'event-with-parameters': any[]
* 'event-with-example-handler': (...args: any[]) => void
* }
* ```
*/
destroyed: boolean;
export type ValidEventTypes = string | symbol | object;
export type EventNames<T extends ValidEventTypes> = T extends string | symbol
? T
: keyof T;
export type ArgumentMap<T extends object> = {
[K in keyof T]: T[K] extends (...args: any[]) => void
? Parameters<T[K]>
: T[K] extends any[]
? T[K]
: any[];
};
export type EventListener<
T extends ValidEventTypes,
K extends EventNames<T>
> = T extends string | symbol
? (...args: any[]) => void
: (
...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]
) => void;
export type EventArgs<
T extends ValidEventTypes,
K extends EventNames<T>
> = Parameters<EventListener<T, K>>;
export const EventEmitter: EventEmitterStatic;
}
declare namespace Peer {
interface PeerJSOption {
key?: string;
host?: string;
port?: number;
path?: string;
secure?: boolean;
config?: RTCConfiguration;
debug?: number;
}
interface PeerConnectOption {
label?: string;
metadata?: any;
serialization?: string;
reliable?: boolean;
}
interface CallOption {
metadata?: any;
sdpTransform?: Function;
}
interface AnswerOption {
sdpTransform?: Function;
}
interface DataConnection<T> {
send(data: T): void;
close(): void;
on(event: string, cb: () => void): void;
on(event: 'data', cb: (data: T) => void): void;
on(event: 'open', cb: () => void): void;
on(event: 'close', cb: () => void): void;
on(event: 'error', cb: (err: any) => void): void;
off(event: string, fn: Function, once?: boolean): void;
dataChannel: RTCDataChannel;
label: string;
metadata: any;
open: boolean;
peerConnection: RTCPeerConnection;
peer: string;
reliable: boolean;
serialization: string;
type: string;
bufferSize: number;
stringify: (data: any) => string;
parse: (data: string) => any;
}
interface MediaConnection {
answer(stream?: MediaStream, options?: AnswerOption): void;
close(): void;
on(event: string, cb: () => void): void;
on(event: 'stream', cb: (stream: MediaStream) => void): void;
on(event: 'close', cb: () => void): void;
on(event: 'error', cb: (err: any) => void): void;
off(event: string, fn: Function, once?: boolean): void;
open: boolean;
metadata: any;
peerConnection: RTCPeerConnection;
peer: string;
type: string;
}
interface UtilSupportsObj {
export interface UtilSupportsObj {
browser: boolean;
webRTC: boolean;
audioVideo: boolean;
@@ -207,9 +140,370 @@ declare namespace Peer {
binaryBlob: boolean;
reliable: boolean;
}
interface util {
browser: string;
supports: UtilSupportsObj;
class Util {
noop(): void;
readonly CLOUD_HOST = '0.peerjs.com';
readonly CLOUD_PORT = 443;
readonly chunkedBrowsers: {
Chrome: number;
chrome: number;
};
readonly chunkedMTU = 16300;
readonly defaultConfig: {
iceServers: (
| {
urls: string;
username?: undefined;
credential?: undefined;
}
| {
urls: string[];
username: string;
credential: string;
}
)[];
sdpSemantics: string;
};
readonly browser: string;
readonly browserVersion: number;
readonly supports: UtilSupportsObj;
validateId(id: string): boolean;
pack: any;
unpack: any;
chunk(
blob: Blob
): {
__peerData: number;
n: number;
total: number;
data: Blob;
}[];
blobToArrayBuffer(
blob: Blob,
cb: (arg: ArrayBuffer | null) => void
): FileReader;
binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer;
randomToken(): string;
isSecure(): boolean;
}
export const util: Util;
export enum LogLevel {
Disabled = 0,
Errors = 1,
Warnings = 2,
All = 3,
}
export enum ConnectionType {
Data = 'data',
Media = 'media',
}
export enum PeerErrorType {
BrowserIncompatible = 'browser-incompatible',
Disconnected = 'disconnected',
InvalidID = 'invalid-id',
InvalidKey = 'invalid-key',
Network = 'network',
PeerUnavailable = 'peer-unavailable',
SslUnavailable = 'ssl-unavailable',
ServerError = 'server-error',
SocketError = 'socket-error',
SocketClosed = 'socket-closed',
UnavailableID = 'unavailable-id',
WebRTC = 'webrtc',
}
export enum SerializationType {
Binary = 'binary',
BinaryUTF8 = 'binary-utf8',
JSON = 'json',
}
export enum SocketEventType {
Message = 'message',
Disconnected = 'disconnected',
Error = 'error',
Close = 'close',
}
export enum ServerMessageType {
Heartbeat = 'HEARTBEAT',
Candidate = 'CANDIDATE',
Offer = 'OFFER',
Answer = 'ANSWER',
Open = 'OPEN',
Error = 'ERROR',
IdTaken = 'ID-TAKEN',
InvalidKey = 'INVALID-KEY',
Leave = 'LEAVE',
Expire = 'EXPIRE',
}
/**
* An abstraction on top of WebSockets to provide fastest
* possible connection for peers.
*/
class Socket extends EventEmitter {
constructor(
secure: any,
host: string,
port: number,
path: string,
key: string,
pingInterval?: number
);
start(id: string, token: string): void;
/** Exposed send for DC & Peer. */
send(data: any): void;
close(): void;
}
class ServerMessage {
type: ServerMessageType;
payload: any;
src: string;
}
type BaseConnectionEvents = {
/**
* Emitted when either you or the remote peer closes the connection.
*/
close: () => void;
error: (error: Error) => void;
iceStateChanged: (state: RTCIceConnectionState) => void;
};
abstract class BaseConnection<
T extends EventEmitter.ValidEventTypes,
TT
> extends EventEmitter<T & BaseConnectionEvents> {
readonly peer: string;
provider: Peer<TT>;
readonly options: any;
protected _open: boolean;
readonly metadata: any;
connectionId: string;
peerConnection: RTCPeerConnection;
abstract get type(): ConnectionType;
get open(): boolean;
constructor(peer: string, provider: Peer<TT>, options: any);
abstract close(): void;
abstract handleMessage(message: ServerMessage): void;
}
type DataConnectionEvents<T> = {
/**
* Emitted when data is received from the remote peer.
*/
data: (data: T) => void;
/**
* Emitted when the connection is established and ready-to-use.
*/
open: () => void;
};
/**
* Wraps a DataChannel between two Peers.
*/
export class DataConnection<T> extends BaseConnection<
DataConnectionEvents<T>,
T
> {
readonly label: string;
readonly serialization: SerializationType;
readonly reliable: boolean;
stringify: (data: any) => string;
parse: (data: string) => any;
get type(): ConnectionType;
get dataChannel(): RTCDataChannel;
get bufferSize(): number;
constructor(peerId: string, provider: Peer<T>, options: any);
/** Called by the Negotiator when the DataChannel is ready. */
initialize(dc: RTCDataChannel): void;
/**
* Exposed functionality for users.
*/
/** Allows user to close connection. */
close(): void;
/** Allows user to send data. */
send(data: T, chunked?: boolean): void;
handleMessage(message: ServerMessage): void;
}
export interface AnswerOption {
sdpTransform?: Function;
}
export interface PeerJSOption {
key?: string;
host?: string;
port?: number;
path?: string;
secure?: boolean;
token?: string;
config?: RTCConfiguration;
debug?: number;
referrerPolicy?: ReferrerPolicy;
}
export interface PeerConnectOption {
label?: string;
metadata?: any;
serialization?: string;
reliable?: boolean;
}
export interface CallOption {
metadata?: any;
sdpTransform?: Function;
}
type MediaConnectionEvents = {
/**
* Emitted when a connection to the PeerServer is established.
*/
stream: (stream: MediaStream) => void;
};
/**
* Wraps the streaming interface between two Peers.
*/
export class MediaConnection<T> extends BaseConnection<
MediaConnectionEvents,
T
> {
get type(): ConnectionType;
get localStream(): MediaStream;
get remoteStream(): MediaStream;
constructor(peerId: string, provider: Peer<T>, options: any);
addStream(remoteStream: any): void;
handleMessage(message: ServerMessage): void;
answer(stream?: MediaStream, options?: AnswerOption): void;
/**
* Exposed functionality for users.
*/
/** Allows user to close connection. */
close(): void;
}
class PeerOptions implements PeerJSOption {
debug?: LogLevel;
host?: string;
port?: number;
path?: string;
key?: string;
token?: string;
config?: any;
secure?: boolean;
pingInterval?: number;
referrerPolicy?: ReferrerPolicy;
logFunction?: (logLevel: LogLevel, ...rest: any[]) => void;
}
type PeerEvents<T> = {
/**
* Emitted when a connection to the PeerServer is established.
*/
open: (id: string) => void;
/**
* Emitted when a new data connection is established from a remote peer.
*/
connection: (dataConnection: DataConnection<T>) => void;
/**
* Emitted when a remote peer attempts to call you.
*/
call: (mediaConnection: MediaConnection<T>) => void;
/**
* Emitted when the peer is destroyed and can no longer accept or create any new connections.
*/
close: () => void;
/**
* Emitted when the peer is disconnected from the signalling server
*/
disconnected: (currentId: string) => void;
/**
* Errors on the peer are almost always fatal and will destroy the peer.
*/
error: (error: Error) => void;
};
}
/**
* A peer who can initiate connections with other peers.
*/
declare class Peer<T> extends EventEmitter<Peer.PeerEvents<T>> {
/**
* The brokering ID of this peer
*/
get id(): string;
get options(): Peer.PeerOptions;
get open(): boolean;
get socket(): Peer.Socket;
/**
* A hash of all connections associated with this peer, keyed by the remote peer's ID.
* @deprecated
* Return type will change from Object to Map<string,[]>
*/
get connections(): Object;
/**
* true if this peer and all of its connections can no longer be used.
*/
get destroyed(): boolean;
/**
* false if there is an active connection to the PeerServer.
*/
get disconnected(): boolean;
/**
* A peer can connect to other peers and listen for connections.
*/
constructor();
/**
* A peer can connect to other peers and listen for connections.
* @param options for specifying details about PeerServer
*/
constructor(options: Peer.PeerOptions);
/**
* A peer can connect to other peers and listen for connections.
* @param id Other peers can connect to this peer using the provided ID.
* If no ID is given, one will be generated by the brokering server.
* @param options for specifying details about PeerServer
*/
constructor(id: string, options?: Peer.PeerOptions);
/** Retrieve messages from lost message store */
_getMessages(connectionId: string): Peer.ServerMessage[];
/**
* Connects to the remote peer specified by id and returns a data connection.
* @param peer The brokering ID of the remote peer (their peer.id).
* @param options for specifying details about Peer Connection
*/
connect(
peer: string,
options?: Peer.PeerConnectOption
): Peer.DataConnection<T>;
/**
* Calls the remote peer specified by id and returns a media connection.
* @param peer The brokering ID of the remote peer (their peer.id).
* @param stream The caller's media stream
* @param options Metadata associated with the connection, passed in by whoever initiated the connection.
*/
call(
peer: string,
stream: MediaStream,
options?: Peer.CallOption
): Peer.MediaConnection<T>;
_removeConnection(
connection: Peer.DataConnection<T> | Peer.MediaConnection<T>
): void;
/** Retrieve a data/media connection for this peer. */
getConnection(
peerId: string,
connectionId: string
): null | Peer.DataConnection<T> | Peer.MediaConnection<T>;
/** Emits a typed error message. */
emitError(type: Peer.PeerErrorType, err: string | Error): void;
/**
* Destroys the Peer: closes all active connections as well as the connection
* to the server.
* Warning: The peer can no longer create or accept connections after being
* destroyed.
*/
destroy(): void;
/**
* Disconnects the Peer's connection to the PeerServer. Does not close any
* active connections.
* Warning: The peer can no longer create or accept connections after being
* disconnected. It also cannot reconnect to the server.
*/
disconnect(): void;
/** Attempts to reconnect with the same ID. */
reconnect(): void;
/**
* Get a list of available peer IDs. If you're running your own server, you'll
* want to set allow_discovery: true in the PeerServer options. If you're using
* the cloud server, email team@peerjs.com to get the functionality enabled for
* your key.
*/
listAllPeers(cb?: (_: any[]) => void): void;
}

View File

@@ -36,9 +36,6 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/PanelSpriteIcon.png")
.SetCategoryFullName(_("General"));
#if defined(GD_IDE_ONLY)
obj.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
obj.AddCondition("Opacity",
_("Opacity"),
_("Compare the opacity of a Panel Sprite, between 0 (fully "
@@ -94,8 +91,7 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetWidth")
.SetGetter("GetWidth")
.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
.SetGetter("GetWidth");
obj.AddCondition("Width",
_("Width"),
@@ -107,8 +103,7 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetWidth")
.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
.SetFunctionName("GetWidth");
obj.AddAction("Height",
_("Height"),
@@ -121,8 +116,7 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetHeight")
.SetGetter("GetHeight")
.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
.SetGetter("GetHeight");
obj.AddCondition("Height",
_("Height"),
@@ -135,8 +129,7 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("SetHeight")
.SetGetter("GetHeight")
.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
.SetGetter("GetHeight");
obj.AddAction("Angle",
"Angle",
@@ -150,8 +143,7 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetAngle")
.SetGetter("GetAngle")
.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
.SetGetter("GetAngle");
obj.AddCondition("Angle",
"Angle",
@@ -165,8 +157,7 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("SetAngle")
.SetGetter("GetAngle")
.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
.SetGetter("GetAngle");
obj.AddAction("Image",
_("Image name"),
@@ -178,7 +169,5 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"), "PanelSprite")
.AddParameter("string", _("Image name"))
.AddCodeOnlyParameter("currentScene", "0")
.SetFunctionName("ChangeAndReloadImage")
.SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h");
#endif
.SetFunctionName("ChangeAndReloadImage");
}

View File

@@ -39,8 +39,6 @@ void DeclareParticleSystemExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/particleSystemicon.png")
.SetCategoryFullName(_("General"));
obj.SetIncludeFile("ParticleSystem/ParticleEmitterObject.h");
// Declaration is too big to be compiled by GCC in one file, unless you have
// 4GB+ ram. :/
ExtensionSubDeclaration1(obj);

View File

@@ -45,8 +45,7 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetAngle")
.SetGetter("GetAngle")
.SetIncludeFile("ParticleSystem/ParticleEmitterObject.h");
.SetGetter("GetAngle");
obj.AddCondition("EmitterAngle",
_("Emission angle"),

View File

@@ -282,7 +282,7 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
obj.AddCondition(
"ParticleAlpha2",
_("Start opacity"),
_("End opacity"),
_("Compare the end opacity of particles."),
_("the end opacity"),
_("Common"),

View File

@@ -135,7 +135,7 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
.UseStandardRelationalOperatorParameters("number");
obj.AddAction("Texture",
_("Change image (using an expression)"),
_("Particle image (using an expression)"),
_("Change the image of particles (if displayed)."),
_("Change the image of particles of _PARAM0_ to _PARAM1_"),
_("Advanced"),
@@ -146,7 +146,7 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
.SetParameterLongDescription("Indicate the name of the resource");
obj.AddAction("SetTextureFromResource",
_("Change image"),
_("Particle image"),
_("Change the image of particles (if displayed)."),
_("Change the image of particles of _PARAM0_ to _PARAM1_"),
_("Common"),

View File

@@ -37,10 +37,6 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
std::make_shared<PathfindingBehavior>(),
std::make_shared<gd::BehaviorsSharedData>());
#if defined(GD_IDE_ONLY)
aut.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
aut.AddAction("SetDestination",
_("Move to a position"),
_("Move the object to a position"),
@@ -54,8 +50,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("expression", _("Destination X position"))
.AddParameter("expression", _("Destination Y position"))
.SetFunctionName("MoveTo")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("MoveTo");
aut.AddCondition("PathFound",
_("Path found"),
@@ -67,8 +62,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("PathFound")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("PathFound");
aut.AddCondition("DestinationReached",
_("Destination reached"),
@@ -80,8 +74,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("DestinationReached")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("DestinationReached");
aut.AddAction("CellWidth",
_("Width of the cells"),
@@ -95,8 +88,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetCellWidth")
.SetGetter("GetCellWidth")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetCellWidth");
aut.AddCondition("CellWidth",
_("Width of the virtual grid"),
@@ -109,8 +101,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetCellWidth")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetCellWidth");
aut.AddAction("CellHeight",
_("Height of the cells"),
@@ -124,8 +115,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetCellHeight")
.SetGetter("GetCellHeight")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetCellHeight");
aut.AddCondition("CellHeight",
_("Height of the virtual grid"),
@@ -138,8 +128,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetCellHeight")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetCellHeight");
aut.AddAction("Acceleration",
_("Acceleration"),
@@ -153,8 +142,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetAcceleration")
.SetGetter("GetAcceleration")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetAcceleration");
aut.AddCondition("Acceleration",
_("Acceleration"),
@@ -167,8 +155,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetAcceleration")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetAcceleration");
aut.AddAction("MaxSpeed",
_("Maximum speed"),
@@ -182,8 +169,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetMaxSpeed")
.SetGetter("GetMaxSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetMaxSpeed");
aut.AddCondition("MaxSpeed",
_("Maximum speed"),
@@ -196,8 +182,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetMaxSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetMaxSpeed");
aut.AddAction("Speed",
_("Speed"),
@@ -211,8 +196,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetSpeed")
.SetGetter("GetSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetSpeed");
aut.AddCondition("Speed",
_("Speed on its path"),
@@ -225,8 +209,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetSpeed");
aut.AddScopedCondition("MovementAngleIsAround",
_("Angle of movement on its path"),
@@ -254,8 +237,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetAngularMaxSpeed")
.SetGetter("GetAngularMaxSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetAngularMaxSpeed");
aut.AddCondition(
"AngularMaxSpeed",
@@ -269,8 +251,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetAngularMaxSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetAngularMaxSpeed");
aut.AddAction(
"AngleOffset",
@@ -285,8 +266,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetAngleOffset")
.SetGetter("GetAngleOffset")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetAngleOffset");
aut.AddCondition("AngleOffset",
_("Rotation offset"),
@@ -299,8 +279,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetAngleOffset")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetAngleOffset");
aut.AddAction(
"ExtraBorder",
@@ -316,8 +295,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetExtraBorder")
.SetGetter("GetExtraBorder")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetGetter("GetExtraBorder");
aut.AddCondition("ExtraBorder",
_("Extra border"),
@@ -331,8 +309,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetExtraBorder")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetExtraBorder");
aut.AddAction(
"AllowDiagonals",
@@ -346,8 +323,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.AddParameter("yesorno", _("Allow?"))
.SetFunctionName("SetAllowDiagonals")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("SetAllowDiagonals");
aut.AddCondition("DiagonalsAllowed",
_("Diagonal movement"),
@@ -360,8 +336,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("DiagonalsAllowed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("DiagonalsAllowed");
aut.AddAction("RotateObject",
_("Rotate the object"),
@@ -374,8 +349,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.AddParameter("yesorno", _("Rotate object?"))
.SetFunctionName("SetRotateObject")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("SetRotateObject");
aut.AddCondition("ObjectRotated",
_("Object rotated"),
@@ -388,8 +362,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("IsObjectRotated")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("IsObjectRotated");
aut.AddExpression("GetNodeX",
_("Get a waypoint X position"),
@@ -399,8 +372,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.AddParameter("expression", _("Node index (start at 0!)"))
.SetFunctionName("GetNodeX")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetNodeX");
aut.AddExpression("GetNodeY",
_("Get a waypoint Y position"),
@@ -410,8 +382,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.AddParameter("expression", _("Node index (start at 0!)"))
.SetFunctionName("GetNodeY")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetNodeY");
aut.AddExpression("NextNodeIndex",
_("Index of the next waypoint"),
@@ -420,8 +391,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetNextNodeIndex")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetNextNodeIndex");
aut.AddExpression("NodeCount",
_("Waypoint count"),
@@ -430,8 +400,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetNodeCount")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetNodeCount");
aut.AddExpression("NextNodeX",
_("Get next waypoint X position"),
@@ -440,8 +409,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetNextNodeX")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetNextNodeX");
aut.AddExpression("NextNodeY",
_("Get next waypoint Y position"),
@@ -450,8 +418,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetNextNodeY")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetNextNodeY");
aut.AddExpression("LastNodeX",
_("Last waypoint X position"),
@@ -460,8 +427,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetLastNodeX")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetLastNodeX");
aut.AddExpression("LastNodeY",
_("Last waypoint Y position"),
@@ -470,8 +436,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetLastNodeY")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetLastNodeY");
aut.AddExpression("DestinationX",
_("Destination X position"),
@@ -480,8 +445,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetDestinationX")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetDestinationX");
aut.AddExpression("DestinationY",
_("Destination Y position"),
@@ -490,8 +454,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetDestinationY")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetDestinationY");
aut.AddExpression("Acceleration",
_("Acceleration"),
@@ -500,8 +463,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetAcceleration")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetAcceleration");
aut.AddExpression("MaxSpeed",
_("Maximum speed"),
@@ -510,8 +472,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetMaxSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetMaxSpeed");
aut.AddExpression("Speed",
_("Speed"),
@@ -520,8 +481,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetSpeed");
aut.AddExpression("AngularMaxSpeed",
_("Angular maximum speed"),
@@ -530,8 +490,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetAngularMaxSpeed")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetAngularMaxSpeed");
aut.AddExpression("AngleOffset",
_("Rotation offset"),
@@ -540,8 +499,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetAngleOffset")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetAngleOffset");
aut.AddExpression("ExtraBorder",
_("Extra border size"),
@@ -550,8 +508,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetExtraBorder")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetExtraBorder");
aut.AddExpression("CellWidth",
_("Width of a cell"),
@@ -560,8 +517,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetCellWidth")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetCellWidth");
aut.AddExpression("CellHeight",
_("Height of a cell"),
@@ -570,8 +526,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.SetFunctionName("GetCellHeight")
.SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h");
.SetFunctionName("GetCellHeight");
aut.AddExpression("MovementAngle",
_("Angle of movement on its path"),
@@ -603,7 +558,6 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardParameters("number");
#endif
}
{
gd::BehaviorMetadata& aut = extension.AddBehavior(
@@ -617,10 +571,6 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
std::make_shared<PathfindingObstacleBehavior>(),
std::make_shared<gd::BehaviorsSharedData>());
#if defined(GD_IDE_ONLY)
aut.SetIncludeFile(
"PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h");
aut.AddAction("Cost",
_("Cost"),
_("Change the cost of going through the object."),
@@ -633,9 +583,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PathfindingObstacleBehavior")
.UseStandardOperatorParameters("number")
.SetFunctionName("SetCost")
.SetGetter("GetCost")
.SetIncludeFile(
"PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h");
.SetGetter("GetCost");
aut.AddCondition("Cost",
_("Cost"),
@@ -648,9 +596,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingObstacleBehavior")
.UseStandardRelationalOperatorParameters("number")
.SetFunctionName("GetCost")
.SetIncludeFile(
"PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h");
.SetFunctionName("GetCost");
aut.AddAction("SetImpassable",
_("Should object be impassable?"),
@@ -663,9 +609,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingObstacleBehavior")
.AddParameter("yesorno", _("Impassable?"))
.SetFunctionName("SetImpassable")
.SetIncludeFile(
"PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h");
.SetFunctionName("SetImpassable");
aut.AddCondition("IsImpassable",
_("Is object impassable?"),
@@ -677,9 +621,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingObstacleBehavior")
.SetFunctionName("IsImpassable")
.SetIncludeFile(
"PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h");
.SetFunctionName("IsImpassable");
aut.AddExpression("Cost",
_("Cost"),
@@ -688,10 +630,6 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingObstacleBehavior")
.SetFunctionName("GetCost")
.SetIncludeFile(
"PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h");
#endif
.SetFunctionName("GetCost");
}
}

View File

@@ -648,6 +648,9 @@ namespace gdjs {
while (this._openNodes.length !== 0) {
//Make sure we do not search forever.
if (iterationCount++ > maxIterationCount) {
console.warn(
`No path was found after covering ${maxIterationCount} cells.`
);
return false;
}

View File

@@ -0,0 +1,633 @@
(function() {
var initializeBox2D = (function() {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
return (
function(Box2D) {
Box2D = Box2D || { };
var a;a||(a=typeof Box2D !== 'undefined' ? Box2D : {});var aa;a.ready=new Promise(function(b){aa=b});var ba={},ca;for(ca in a)a.hasOwnProperty(ca)&&(ba[ca]=a[ca]);var da=!1,ea=!1,fa=!1,ha=!1;da="object"===typeof window;ea="function"===typeof importScripts;fa="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;ha=!da&&!fa&&!ea;var ia="",ja,ka,la,ma;
if(fa)ia=ea?require("path").dirname(ia)+"/":__dirname+"/",ja=function(b,c){la||(la=require("fs"));ma||(ma=require("path"));b=ma.normalize(b);return la.readFileSync(b,c?null:"utf8")},ka=function(b){b=ja(b,!0);b.buffer||(b=new Uint8Array(b));assert(b.buffer);return b},1<process.argv.length&&process.argv[1].replace(/\\/g,"/"),process.argv.slice(2),process.on("uncaughtException",function(b){throw b;}),process.on("unhandledRejection",na),a.inspect=function(){return"[Emscripten Module object]"};else if(ha)"undefined"!=
typeof read&&(ja=function(b){return read(b)}),ka=function(b){if("function"===typeof readbuffer)return new Uint8Array(readbuffer(b));b=read(b,"binary");assert("object"===typeof b);return b},"undefined"!==typeof print&&("undefined"===typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!==typeof printErr?printErr:print);else if(da||ea)ea?ia=self.location.href:document.currentScript&&(ia=document.currentScript.src),_scriptDir&&(ia=_scriptDir),ia=0!==ia.indexOf("blob:")?
ia.substr(0,ia.lastIndexOf("/")+1):"",ja=function(b){var c=new XMLHttpRequest;c.open("GET",b,!1);c.send(null);return c.responseText},ea&&(ka=function(b){var c=new XMLHttpRequest;c.open("GET",b,!1);c.responseType="arraybuffer";c.send(null);return new Uint8Array(c.response)});var pa=a.print||console.log.bind(console),qa=a.printErr||console.warn.bind(console);for(ca in ba)ba.hasOwnProperty(ca)&&(a[ca]=ba[ca]);ba=null;var ra;a.wasmBinary&&(ra=a.wasmBinary);var noExitRuntime;
a.noExitRuntime&&(noExitRuntime=a.noExitRuntime);"object"!==typeof WebAssembly&&qa("no native wasm support detected");var sa,ta=new WebAssembly.Table({initial:210,maximum:230,element:"anyfunc"}),ua=!1;function assert(b,c){b||na("Assertion failed: "+c)}var va="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;
function wa(b,c,d){var f=c+d;for(d=c;b[d]&&!(d>=f);)++d;if(16<d-c&&b.subarray&&va)return va.decode(b.subarray(c,d));for(f="";c<d;){var y=b[c++];if(y&128){var oa=b[c++]&63;if(192==(y&224))f+=String.fromCharCode((y&31)<<6|oa);else{var ya=b[c++]&63;y=224==(y&240)?(y&15)<<12|oa<<6|ya:(y&7)<<18|oa<<12|ya<<6|b[c++]&63;65536>y?f+=String.fromCharCode(y):(y-=65536,f+=String.fromCharCode(55296|y>>10,56320|y&1023))}}else f+=String.fromCharCode(y)}return f}function xa(b){return b?wa(za,b,void 0):""}
var Aa,za,Ba,Ca;function Da(b){Aa=b;a.HEAP8=new Int8Array(b);a.HEAP16=new Int16Array(b);a.HEAP32=Ba=new Int32Array(b);a.HEAPU8=za=new Uint8Array(b);a.HEAPU16=new Uint16Array(b);a.HEAPU32=new Uint32Array(b);a.HEAPF32=new Float32Array(b);a.HEAPF64=Ca=new Float64Array(b)}var Ea=a.INITIAL_MEMORY||16777216;if(sa=a.wasmMemory?a.wasmMemory:new WebAssembly.Memory({initial:Ea/65536,maximum:32768}))Aa=sa.buffer;Ea=Aa.byteLength;Da(Aa);Ba[6512]=5269088;
function Fa(b){for(;0<b.length;){var c=b.shift();if("function"==typeof c)c(a);else{var d=c.ev;"number"===typeof d?void 0===c.Au?a.dynCall_v(d):a.dynCall_vi(d,c.Au):d(void 0===c.Au?null:c.Au)}}}var Ga=[],Ha=[],Ia=[],Ja=[],Ka=!1;function La(){var b=a.preRun.shift();Ga.unshift(b)}var Ma=0,Na=null,Oa=null;a.preloadedImages={};a.preloadedAudios={};
function na(b){if(a.onAbort)a.onAbort(b);b+="";pa(b);qa(b);ua=!0;throw new WebAssembly.RuntimeError("abort("+b+"). Build with -s ASSERTIONS=1 for more info.");}function Pa(b){var c=Qa;return String.prototype.startsWith?c.startsWith(b):0===c.indexOf(b)}function Ra(){return Pa("data:application/octet-stream;base64,")}var Qa="Box2D_v2.3.1_min.wasm.wasm";if(!Ra()){var Sa=Qa;Qa=a.locateFile?a.locateFile(Sa,ia):ia+Sa}
function Ta(){try{if(ra)return new Uint8Array(ra);if(ka)return ka(Qa);throw"both async and sync fetching of the wasm failed";}catch(b){na(b)}}function Ua(){return ra||!da&&!ea||"function"!==typeof fetch||Pa("file://")?new Promise(function(b){b(Ta())}):fetch(Qa,{credentials:"same-origin"}).then(function(b){if(!b.ok)throw"failed to load wasm binary file at '"+Qa+"'";return b.arrayBuffer()}).catch(function(){return Ta()})}
var Va={1156:function(b,c){b=a.getCache(a.JSDestructionListener)[b];if(!b.hasOwnProperty("SayGoodbyeJoint"))throw"a JSImplementation must implement all functions, you forgot JSDestructionListener::SayGoodbyeJoint.";b.SayGoodbyeJoint(c)},1414:function(b,c){b=a.getCache(a.JSDestructionListener)[b];if(!b.hasOwnProperty("SayGoodbyeFixture"))throw"a JSImplementation must implement all functions, you forgot JSDestructionListener::SayGoodbyeFixture.";b.SayGoodbyeFixture(c)},1840:function(b,c){b=a.getCache(a.JSQueryCallback)[b];
if(!b.hasOwnProperty("ReportFixture"))throw"a JSImplementation must implement all functions, you forgot JSQueryCallback::ReportFixture.";return b.ReportFixture(c)},2104:function(b,c,d,f,y){b=a.getCache(a.JSRayCastCallback)[b];if(!b.hasOwnProperty("ReportFixture"))throw"a JSImplementation must implement all functions, you forgot JSRayCastCallback::ReportFixture.";return b.ReportFixture(c,d,f,y)},2400:function(b,c){b=a.getCache(a.JSContactListener)[b];if(!b.hasOwnProperty("BeginContact"))throw"a JSImplementation must implement all functions, you forgot JSContactListener::BeginContact.";
b.BeginContact(c)},2638:function(b,c){b=a.getCache(a.JSContactListener)[b];if(!b.hasOwnProperty("EndContact"))throw"a JSImplementation must implement all functions, you forgot JSContactListener::EndContact.";b.EndContact(c)},2870:function(b,c,d){b=a.getCache(a.JSContactListener)[b];if(!b.hasOwnProperty("PreSolve"))throw"a JSImplementation must implement all functions, you forgot JSContactListener::PreSolve.";b.PreSolve(c,d)},3103:function(b,c,d){b=a.getCache(a.JSContactListener)[b];if(!b.hasOwnProperty("PostSolve"))throw"a JSImplementation must implement all functions, you forgot JSContactListener::PostSolve.";
b.PostSolve(c,d)},3452:function(b,c,d){b=a.getCache(a.JSContactFilter)[b];if(!b.hasOwnProperty("ShouldCollide"))throw"a JSImplementation must implement all functions, you forgot JSContactFilter::ShouldCollide.";return b.ShouldCollide(c,d)},3744:function(b,c,d,f){b=a.getCache(a.JSDraw)[b];if(!b.hasOwnProperty("DrawPolygon"))throw"a JSImplementation must implement all functions, you forgot JSDraw::DrawPolygon.";b.DrawPolygon(c,d,f)},3968:function(b,c,d,f){b=a.getCache(a.JSDraw)[b];if(!b.hasOwnProperty("DrawSolidPolygon"))throw"a JSImplementation must implement all functions, you forgot JSDraw::DrawSolidPolygon.";
b.DrawSolidPolygon(c,d,f)},4202:function(b,c,d,f){b=a.getCache(a.JSDraw)[b];if(!b.hasOwnProperty("DrawCircle"))throw"a JSImplementation must implement all functions, you forgot JSDraw::DrawCircle.";b.DrawCircle(c,d,f)},4423:function(b,c,d,f,y){b=a.getCache(a.JSDraw)[b];if(!b.hasOwnProperty("DrawSolidCircle"))throw"a JSImplementation must implement all functions, you forgot JSDraw::DrawSolidCircle.";b.DrawSolidCircle(c,d,f,y)},4663:function(b,c,d,f){b=a.getCache(a.JSDraw)[b];if(!b.hasOwnProperty("DrawSegment"))throw"a JSImplementation must implement all functions, you forgot JSDraw::DrawSegment.";
b.DrawSegment(c,d,f)},4887:function(b,c){b=a.getCache(a.JSDraw)[b];if(!b.hasOwnProperty("DrawTransform"))throw"a JSImplementation must implement all functions, you forgot JSDraw::DrawTransform.";b.DrawTransform(c)}};Ha.push({ev:function(){Wa()}});var Xa=[null,[],[]];function Ya(b,c){Za||(Za=[]);var d=Za;d.length=0;for(var f;f=za[b++];)100===f||102===f?(c=c+7&-8,d.push(Ca[c>>3]),c+=8):(c=c+3&-4,d.push(Ba[c>>2]),c+=4);return d}
var Za,$a={a:function(b,c,d,f){na("Assertion failed: "+xa(b)+", at: "+[c?xa(c):"unknown filename",d,f?xa(f):"unknown function"])},g:function(){na()},d:function(b,c,d){c=Ya(c,d);return Va[b].apply(null,c)},b:function(b,c,d){c=Ya(c,d);return Va[b].apply(null,c)},e:function(b,c,d){za.copyWithin(b,c,c+d)},f:function(b){b>>>=0;var c=za.length;if(2147483648<b)return!1;for(var d=1;4>=d;d*=2){var f=c*(1+.2/d);f=Math.min(f,b+100663296);f=Math.max(16777216,b,f);0<f%65536&&(f+=65536-f%65536);a:{try{sa.grow(Math.min(2147483648,
f)-Aa.byteLength+65535>>>16);Da(sa.buffer);var y=1;break a}catch(oa){}y=void 0}if(y)return!0}return!1},c:function(b,c,d,f){for(var y=0,oa=0;oa<d;oa++){for(var ya=Ba[c+8*oa>>2],ab=Ba[c+(8*oa+4)>>2],jb=0;jb<ab;jb++){var kb=za[ya+jb],lb=Xa[b];0===kb||10===kb?((1===b?pa:qa)(wa(lb,0)),lb.length=0):lb.push(kb)}y+=ab}Ba[f>>2]=y;return 0},memory:sa,table:ta},bb=function(){function b(y){a.asm=y.exports;Ma--;a.monitorRunDependencies&&a.monitorRunDependencies(Ma);0==Ma&&(null!==Na&&(clearInterval(Na),Na=null),
Oa&&(y=Oa,Oa=null,y()))}function c(y){b(y.instance)}function d(y){return Ua().then(function(oa){return WebAssembly.instantiate(oa,f)}).then(y,function(oa){qa("failed to asynchronously prepare wasm: "+oa);na(oa)})}var f={a:$a};Ma++;a.monitorRunDependencies&&a.monitorRunDependencies(Ma);if(a.instantiateWasm)try{return a.instantiateWasm(f,b)}catch(y){return qa("Module.instantiateWasm callback failed with error: "+y),!1}(function(){if(ra||"function"!==typeof WebAssembly.instantiateStreaming||Ra()||Pa("file://")||
"function"!==typeof fetch)return d(c);fetch(Qa,{credentials:"same-origin"}).then(function(y){return WebAssembly.instantiateStreaming(y,f).then(c,function(oa){qa("wasm streaming compile failed: "+oa);qa("falling back to ArrayBuffer instantiation");d(c)})})})();return{}}();a.asm=bb;var Wa=a.___wasm_call_ctors=function(){return(Wa=a.___wasm_call_ctors=a.asm.h).apply(null,arguments)};a.___em_js__array_bounds_check_error=function(){return(a.___em_js__array_bounds_check_error=a.asm.i).apply(null,arguments)};
var cb=a._emscripten_bind_b2DestructionListenerWrapper___destroy___0=function(){return(cb=a._emscripten_bind_b2DestructionListenerWrapper___destroy___0=a.asm.j).apply(null,arguments)},db=a._emscripten_bind_b2Draw_SetFlags_1=function(){return(db=a._emscripten_bind_b2Draw_SetFlags_1=a.asm.k).apply(null,arguments)},eb=a._emscripten_bind_b2Draw_GetFlags_0=function(){return(eb=a._emscripten_bind_b2Draw_GetFlags_0=a.asm.l).apply(null,arguments)},fb=a._emscripten_bind_b2Draw_AppendFlags_1=function(){return(fb=
a._emscripten_bind_b2Draw_AppendFlags_1=a.asm.m).apply(null,arguments)},gb=a._emscripten_bind_b2Draw_ClearFlags_1=function(){return(gb=a._emscripten_bind_b2Draw_ClearFlags_1=a.asm.n).apply(null,arguments)},hb=a._emscripten_bind_b2Draw___destroy___0=function(){return(hb=a._emscripten_bind_b2Draw___destroy___0=a.asm.o).apply(null,arguments)},ib=a._emscripten_bind_b2Joint_GetType_0=function(){return(ib=a._emscripten_bind_b2Joint_GetType_0=a.asm.p).apply(null,arguments)},mb=a._emscripten_bind_b2Joint_GetBodyA_0=
function(){return(mb=a._emscripten_bind_b2Joint_GetBodyA_0=a.asm.q).apply(null,arguments)},nb=a._emscripten_bind_b2Joint_GetBodyB_0=function(){return(nb=a._emscripten_bind_b2Joint_GetBodyB_0=a.asm.r).apply(null,arguments)},ob=a._emscripten_bind_b2Joint_GetAnchorA_0=function(){return(ob=a._emscripten_bind_b2Joint_GetAnchorA_0=a.asm.s).apply(null,arguments)},pb=a._emscripten_bind_b2Joint_GetAnchorB_0=function(){return(pb=a._emscripten_bind_b2Joint_GetAnchorB_0=a.asm.t).apply(null,arguments)},qb=a._emscripten_bind_b2Joint_GetReactionForce_1=
function(){return(qb=a._emscripten_bind_b2Joint_GetReactionForce_1=a.asm.u).apply(null,arguments)},rb=a._emscripten_bind_b2Joint_GetReactionTorque_1=function(){return(rb=a._emscripten_bind_b2Joint_GetReactionTorque_1=a.asm.v).apply(null,arguments)},sb=a._emscripten_bind_b2Joint_GetNext_0=function(){return(sb=a._emscripten_bind_b2Joint_GetNext_0=a.asm.w).apply(null,arguments)},tb=a._emscripten_bind_b2Joint_GetUserData_0=function(){return(tb=a._emscripten_bind_b2Joint_GetUserData_0=a.asm.x).apply(null,
arguments)},ub=a._emscripten_bind_b2Joint_SetUserData_1=function(){return(ub=a._emscripten_bind_b2Joint_SetUserData_1=a.asm.y).apply(null,arguments)},vb=a._emscripten_bind_b2Joint_IsActive_0=function(){return(vb=a._emscripten_bind_b2Joint_IsActive_0=a.asm.z).apply(null,arguments)},wb=a._emscripten_bind_b2Joint_GetCollideConnected_0=function(){return(wb=a._emscripten_bind_b2Joint_GetCollideConnected_0=a.asm.A).apply(null,arguments)},xb=a._emscripten_bind_b2Joint_Dump_0=function(){return(xb=a._emscripten_bind_b2Joint_Dump_0=
a.asm.B).apply(null,arguments)},yb=a._emscripten_bind_b2RayCastCallback___destroy___0=function(){return(yb=a._emscripten_bind_b2RayCastCallback___destroy___0=a.asm.C).apply(null,arguments)},zb=a._emscripten_bind_b2ContactListener___destroy___0=function(){return(zb=a._emscripten_bind_b2ContactListener___destroy___0=a.asm.D).apply(null,arguments)},Ab=a._emscripten_bind_b2QueryCallback___destroy___0=function(){return(Ab=a._emscripten_bind_b2QueryCallback___destroy___0=a.asm.E).apply(null,arguments)},
Bb=a._emscripten_bind_b2JointDef_b2JointDef_0=function(){return(Bb=a._emscripten_bind_b2JointDef_b2JointDef_0=a.asm.F).apply(null,arguments)},Cb=a._emscripten_bind_b2JointDef_get_type_0=function(){return(Cb=a._emscripten_bind_b2JointDef_get_type_0=a.asm.G).apply(null,arguments)},Db=a._emscripten_bind_b2JointDef_set_type_1=function(){return(Db=a._emscripten_bind_b2JointDef_set_type_1=a.asm.H).apply(null,arguments)},Eb=a._emscripten_bind_b2JointDef_get_userData_0=function(){return(Eb=a._emscripten_bind_b2JointDef_get_userData_0=
a.asm.I).apply(null,arguments)},Fb=a._emscripten_bind_b2JointDef_set_userData_1=function(){return(Fb=a._emscripten_bind_b2JointDef_set_userData_1=a.asm.J).apply(null,arguments)},Gb=a._emscripten_bind_b2JointDef_get_bodyA_0=function(){return(Gb=a._emscripten_bind_b2JointDef_get_bodyA_0=a.asm.K).apply(null,arguments)},Hb=a._emscripten_bind_b2JointDef_set_bodyA_1=function(){return(Hb=a._emscripten_bind_b2JointDef_set_bodyA_1=a.asm.L).apply(null,arguments)},Ib=a._emscripten_bind_b2JointDef_get_bodyB_0=
function(){return(Ib=a._emscripten_bind_b2JointDef_get_bodyB_0=a.asm.M).apply(null,arguments)},Jb=a._emscripten_bind_b2JointDef_set_bodyB_1=function(){return(Jb=a._emscripten_bind_b2JointDef_set_bodyB_1=a.asm.N).apply(null,arguments)},Kb=a._emscripten_bind_b2JointDef_get_collideConnected_0=function(){return(Kb=a._emscripten_bind_b2JointDef_get_collideConnected_0=a.asm.O).apply(null,arguments)},Lb=a._emscripten_bind_b2JointDef_set_collideConnected_1=function(){return(Lb=a._emscripten_bind_b2JointDef_set_collideConnected_1=
a.asm.P).apply(null,arguments)},Mb=a._emscripten_bind_b2JointDef___destroy___0=function(){return(Mb=a._emscripten_bind_b2JointDef___destroy___0=a.asm.Q).apply(null,arguments)},Nb=a._emscripten_bind_b2Shape_GetType_0=function(){return(Nb=a._emscripten_bind_b2Shape_GetType_0=a.asm.R).apply(null,arguments)},Ob=a._emscripten_bind_b2Shape_GetChildCount_0=function(){return(Ob=a._emscripten_bind_b2Shape_GetChildCount_0=a.asm.S).apply(null,arguments)},Pb=a._emscripten_bind_b2Shape_TestPoint_2=function(){return(Pb=
a._emscripten_bind_b2Shape_TestPoint_2=a.asm.T).apply(null,arguments)},Qb=a._emscripten_bind_b2Shape_RayCast_4=function(){return(Qb=a._emscripten_bind_b2Shape_RayCast_4=a.asm.U).apply(null,arguments)},Rb=a._emscripten_bind_b2Shape_ComputeAABB_3=function(){return(Rb=a._emscripten_bind_b2Shape_ComputeAABB_3=a.asm.V).apply(null,arguments)},Sb=a._emscripten_bind_b2Shape_ComputeMass_2=function(){return(Sb=a._emscripten_bind_b2Shape_ComputeMass_2=a.asm.W).apply(null,arguments)},Tb=a._emscripten_bind_b2Shape_get_m_type_0=
function(){return(Tb=a._emscripten_bind_b2Shape_get_m_type_0=a.asm.X).apply(null,arguments)},Ub=a._emscripten_bind_b2Shape_set_m_type_1=function(){return(Ub=a._emscripten_bind_b2Shape_set_m_type_1=a.asm.Y).apply(null,arguments)},Vb=a._emscripten_bind_b2Shape_get_m_radius_0=function(){return(Vb=a._emscripten_bind_b2Shape_get_m_radius_0=a.asm.Z).apply(null,arguments)},Wb=a._emscripten_bind_b2Shape_set_m_radius_1=function(){return(Wb=a._emscripten_bind_b2Shape_set_m_radius_1=a.asm._).apply(null,arguments)},
Xb=a._emscripten_bind_b2Shape___destroy___0=function(){return(Xb=a._emscripten_bind_b2Shape___destroy___0=a.asm.$).apply(null,arguments)},Yb=a._emscripten_bind_b2ContactFilter___destroy___0=function(){return(Yb=a._emscripten_bind_b2ContactFilter___destroy___0=a.asm.aa).apply(null,arguments)},Zb=a._emscripten_bind_JSDestructionListener_JSDestructionListener_0=function(){return(Zb=a._emscripten_bind_JSDestructionListener_JSDestructionListener_0=a.asm.ba).apply(null,arguments)},$b=a._emscripten_bind_JSDestructionListener_SayGoodbyeJoint_1=
function(){return($b=a._emscripten_bind_JSDestructionListener_SayGoodbyeJoint_1=a.asm.ca).apply(null,arguments)},ac=a._emscripten_bind_JSDestructionListener_SayGoodbyeFixture_1=function(){return(ac=a._emscripten_bind_JSDestructionListener_SayGoodbyeFixture_1=a.asm.da).apply(null,arguments)},bc=a._emscripten_bind_JSDestructionListener___destroy___0=function(){return(bc=a._emscripten_bind_JSDestructionListener___destroy___0=a.asm.ea).apply(null,arguments)},cc=a._emscripten_bind_b2ContactImpulse_get_count_0=
function(){return(cc=a._emscripten_bind_b2ContactImpulse_get_count_0=a.asm.fa).apply(null,arguments)},dc=a._emscripten_bind_b2ContactImpulse_set_count_1=function(){return(dc=a._emscripten_bind_b2ContactImpulse_set_count_1=a.asm.ga).apply(null,arguments)},ec=a._emscripten_bind_b2ContactImpulse___destroy___0=function(){return(ec=a._emscripten_bind_b2ContactImpulse___destroy___0=a.asm.ha).apply(null,arguments)},fc=a._emscripten_bind_b2DistanceJoint_GetLocalAnchorA_0=function(){return(fc=a._emscripten_bind_b2DistanceJoint_GetLocalAnchorA_0=
a.asm.ia).apply(null,arguments)},hc=a._emscripten_bind_b2DistanceJoint_GetLocalAnchorB_0=function(){return(hc=a._emscripten_bind_b2DistanceJoint_GetLocalAnchorB_0=a.asm.ja).apply(null,arguments)},ic=a._emscripten_bind_b2DistanceJoint_SetLength_1=function(){return(ic=a._emscripten_bind_b2DistanceJoint_SetLength_1=a.asm.ka).apply(null,arguments)},jc=a._emscripten_bind_b2DistanceJoint_GetLength_0=function(){return(jc=a._emscripten_bind_b2DistanceJoint_GetLength_0=a.asm.la).apply(null,arguments)},kc=
a._emscripten_bind_b2DistanceJoint_SetFrequency_1=function(){return(kc=a._emscripten_bind_b2DistanceJoint_SetFrequency_1=a.asm.ma).apply(null,arguments)},lc=a._emscripten_bind_b2DistanceJoint_GetFrequency_0=function(){return(lc=a._emscripten_bind_b2DistanceJoint_GetFrequency_0=a.asm.na).apply(null,arguments)},mc=a._emscripten_bind_b2DistanceJoint_SetDampingRatio_1=function(){return(mc=a._emscripten_bind_b2DistanceJoint_SetDampingRatio_1=a.asm.oa).apply(null,arguments)},nc=a._emscripten_bind_b2DistanceJoint_GetDampingRatio_0=
function(){return(nc=a._emscripten_bind_b2DistanceJoint_GetDampingRatio_0=a.asm.pa).apply(null,arguments)},oc=a._emscripten_bind_b2DistanceJoint_GetType_0=function(){return(oc=a._emscripten_bind_b2DistanceJoint_GetType_0=a.asm.qa).apply(null,arguments)},pc=a._emscripten_bind_b2DistanceJoint_GetBodyA_0=function(){return(pc=a._emscripten_bind_b2DistanceJoint_GetBodyA_0=a.asm.ra).apply(null,arguments)},qc=a._emscripten_bind_b2DistanceJoint_GetBodyB_0=function(){return(qc=a._emscripten_bind_b2DistanceJoint_GetBodyB_0=
a.asm.sa).apply(null,arguments)},rc=a._emscripten_bind_b2DistanceJoint_GetAnchorA_0=function(){return(rc=a._emscripten_bind_b2DistanceJoint_GetAnchorA_0=a.asm.ta).apply(null,arguments)},sc=a._emscripten_bind_b2DistanceJoint_GetAnchorB_0=function(){return(sc=a._emscripten_bind_b2DistanceJoint_GetAnchorB_0=a.asm.ua).apply(null,arguments)},tc=a._emscripten_bind_b2DistanceJoint_GetReactionForce_1=function(){return(tc=a._emscripten_bind_b2DistanceJoint_GetReactionForce_1=a.asm.va).apply(null,arguments)},
uc=a._emscripten_bind_b2DistanceJoint_GetReactionTorque_1=function(){return(uc=a._emscripten_bind_b2DistanceJoint_GetReactionTorque_1=a.asm.wa).apply(null,arguments)},vc=a._emscripten_bind_b2DistanceJoint_GetNext_0=function(){return(vc=a._emscripten_bind_b2DistanceJoint_GetNext_0=a.asm.xa).apply(null,arguments)},wc=a._emscripten_bind_b2DistanceJoint_GetUserData_0=function(){return(wc=a._emscripten_bind_b2DistanceJoint_GetUserData_0=a.asm.ya).apply(null,arguments)},xc=a._emscripten_bind_b2DistanceJoint_SetUserData_1=
function(){return(xc=a._emscripten_bind_b2DistanceJoint_SetUserData_1=a.asm.za).apply(null,arguments)},yc=a._emscripten_bind_b2DistanceJoint_IsActive_0=function(){return(yc=a._emscripten_bind_b2DistanceJoint_IsActive_0=a.asm.Aa).apply(null,arguments)},zc=a._emscripten_bind_b2DistanceJoint_GetCollideConnected_0=function(){return(zc=a._emscripten_bind_b2DistanceJoint_GetCollideConnected_0=a.asm.Ba).apply(null,arguments)},Ac=a._emscripten_bind_b2DistanceJoint___destroy___0=function(){return(Ac=a._emscripten_bind_b2DistanceJoint___destroy___0=
a.asm.Ca).apply(null,arguments)},Bc=a._emscripten_bind_b2Mat33_b2Mat33_0=function(){return(Bc=a._emscripten_bind_b2Mat33_b2Mat33_0=a.asm.Da).apply(null,arguments)},Cc=a._emscripten_bind_b2Mat33_b2Mat33_3=function(){return(Cc=a._emscripten_bind_b2Mat33_b2Mat33_3=a.asm.Ea).apply(null,arguments)},Dc=a._emscripten_bind_b2Mat33_SetZero_0=function(){return(Dc=a._emscripten_bind_b2Mat33_SetZero_0=a.asm.Fa).apply(null,arguments)},Ec=a._emscripten_bind_b2Mat33_Solve33_1=function(){return(Ec=a._emscripten_bind_b2Mat33_Solve33_1=
a.asm.Ga).apply(null,arguments)},Fc=a._emscripten_bind_b2Mat33_Solve22_1=function(){return(Fc=a._emscripten_bind_b2Mat33_Solve22_1=a.asm.Ha).apply(null,arguments)},Gc=a._emscripten_bind_b2Mat33_GetInverse22_1=function(){return(Gc=a._emscripten_bind_b2Mat33_GetInverse22_1=a.asm.Ia).apply(null,arguments)},Hc=a._emscripten_bind_b2Mat33_GetSymInverse33_1=function(){return(Hc=a._emscripten_bind_b2Mat33_GetSymInverse33_1=a.asm.Ja).apply(null,arguments)},Ic=a._emscripten_bind_b2Mat33_get_ex_0=function(){return(Ic=
a._emscripten_bind_b2Mat33_get_ex_0=a.asm.Ka).apply(null,arguments)},Jc=a._emscripten_bind_b2Mat33_set_ex_1=function(){return(Jc=a._emscripten_bind_b2Mat33_set_ex_1=a.asm.La).apply(null,arguments)},Kc=a._emscripten_bind_b2Mat33_get_ey_0=function(){return(Kc=a._emscripten_bind_b2Mat33_get_ey_0=a.asm.Ma).apply(null,arguments)},Lc=a._emscripten_bind_b2Mat33_set_ey_1=function(){return(Lc=a._emscripten_bind_b2Mat33_set_ey_1=a.asm.Na).apply(null,arguments)},Mc=a._emscripten_bind_b2Mat33_get_ez_0=function(){return(Mc=
a._emscripten_bind_b2Mat33_get_ez_0=a.asm.Oa).apply(null,arguments)},Nc=a._emscripten_bind_b2Mat33_set_ez_1=function(){return(Nc=a._emscripten_bind_b2Mat33_set_ez_1=a.asm.Pa).apply(null,arguments)},Oc=a._emscripten_bind_b2Mat33___destroy___0=function(){return(Oc=a._emscripten_bind_b2Mat33___destroy___0=a.asm.Qa).apply(null,arguments)},Pc=a._emscripten_bind_b2Fixture_GetType_0=function(){return(Pc=a._emscripten_bind_b2Fixture_GetType_0=a.asm.Ra).apply(null,arguments)},Qc=a._emscripten_bind_b2Fixture_GetShape_0=
function(){return(Qc=a._emscripten_bind_b2Fixture_GetShape_0=a.asm.Sa).apply(null,arguments)},Rc=a._emscripten_bind_b2Fixture_SetSensor_1=function(){return(Rc=a._emscripten_bind_b2Fixture_SetSensor_1=a.asm.Ta).apply(null,arguments)},Sc=a._emscripten_bind_b2Fixture_IsSensor_0=function(){return(Sc=a._emscripten_bind_b2Fixture_IsSensor_0=a.asm.Ua).apply(null,arguments)},Tc=a._emscripten_bind_b2Fixture_SetFilterData_1=function(){return(Tc=a._emscripten_bind_b2Fixture_SetFilterData_1=a.asm.Va).apply(null,
arguments)},Uc=a._emscripten_bind_b2Fixture_GetFilterData_0=function(){return(Uc=a._emscripten_bind_b2Fixture_GetFilterData_0=a.asm.Wa).apply(null,arguments)},Vc=a._emscripten_bind_b2Fixture_Refilter_0=function(){return(Vc=a._emscripten_bind_b2Fixture_Refilter_0=a.asm.Xa).apply(null,arguments)},Wc=a._emscripten_bind_b2Fixture_GetBody_0=function(){return(Wc=a._emscripten_bind_b2Fixture_GetBody_0=a.asm.Ya).apply(null,arguments)},Xc=a._emscripten_bind_b2Fixture_GetNext_0=function(){return(Xc=a._emscripten_bind_b2Fixture_GetNext_0=
a.asm.Za).apply(null,arguments)},Yc=a._emscripten_bind_b2Fixture_GetUserData_0=function(){return(Yc=a._emscripten_bind_b2Fixture_GetUserData_0=a.asm._a).apply(null,arguments)},Zc=a._emscripten_bind_b2Fixture_SetUserData_1=function(){return(Zc=a._emscripten_bind_b2Fixture_SetUserData_1=a.asm.$a).apply(null,arguments)},$c=a._emscripten_bind_b2Fixture_TestPoint_1=function(){return($c=a._emscripten_bind_b2Fixture_TestPoint_1=a.asm.ab).apply(null,arguments)},ad=a._emscripten_bind_b2Fixture_RayCast_3=function(){return(ad=
a._emscripten_bind_b2Fixture_RayCast_3=a.asm.bb).apply(null,arguments)},bd=a._emscripten_bind_b2Fixture_GetMassData_1=function(){return(bd=a._emscripten_bind_b2Fixture_GetMassData_1=a.asm.cb).apply(null,arguments)},cd=a._emscripten_bind_b2Fixture_SetDensity_1=function(){return(cd=a._emscripten_bind_b2Fixture_SetDensity_1=a.asm.db).apply(null,arguments)},dd=a._emscripten_bind_b2Fixture_GetDensity_0=function(){return(dd=a._emscripten_bind_b2Fixture_GetDensity_0=a.asm.eb).apply(null,arguments)},ed=a._emscripten_bind_b2Fixture_GetFriction_0=
function(){return(ed=a._emscripten_bind_b2Fixture_GetFriction_0=a.asm.fb).apply(null,arguments)},fd=a._emscripten_bind_b2Fixture_SetFriction_1=function(){return(fd=a._emscripten_bind_b2Fixture_SetFriction_1=a.asm.gb).apply(null,arguments)},gd=a._emscripten_bind_b2Fixture_GetRestitution_0=function(){return(gd=a._emscripten_bind_b2Fixture_GetRestitution_0=a.asm.hb).apply(null,arguments)},hd=a._emscripten_bind_b2Fixture_SetRestitution_1=function(){return(hd=a._emscripten_bind_b2Fixture_SetRestitution_1=
a.asm.ib).apply(null,arguments)},id=a._emscripten_bind_b2Fixture_GetAABB_1=function(){return(id=a._emscripten_bind_b2Fixture_GetAABB_1=a.asm.jb).apply(null,arguments)},jd=a._emscripten_bind_b2Fixture_Dump_1=function(){return(jd=a._emscripten_bind_b2Fixture_Dump_1=a.asm.kb).apply(null,arguments)},kd=a._emscripten_bind_b2Fixture___destroy___0=function(){return(kd=a._emscripten_bind_b2Fixture___destroy___0=a.asm.lb).apply(null,arguments)},ld=a._emscripten_bind_b2Filter_b2Filter_0=function(){return(ld=
a._emscripten_bind_b2Filter_b2Filter_0=a.asm.mb).apply(null,arguments)},md=a._emscripten_bind_b2Filter_get_categoryBits_0=function(){return(md=a._emscripten_bind_b2Filter_get_categoryBits_0=a.asm.nb).apply(null,arguments)},nd=a._emscripten_bind_b2Filter_set_categoryBits_1=function(){return(nd=a._emscripten_bind_b2Filter_set_categoryBits_1=a.asm.ob).apply(null,arguments)},od=a._emscripten_bind_b2Filter_get_maskBits_0=function(){return(od=a._emscripten_bind_b2Filter_get_maskBits_0=a.asm.pb).apply(null,
arguments)},pd=a._emscripten_bind_b2Filter_set_maskBits_1=function(){return(pd=a._emscripten_bind_b2Filter_set_maskBits_1=a.asm.qb).apply(null,arguments)},qd=a._emscripten_bind_b2Filter_get_groupIndex_0=function(){return(qd=a._emscripten_bind_b2Filter_get_groupIndex_0=a.asm.rb).apply(null,arguments)},rd=a._emscripten_bind_b2Filter_set_groupIndex_1=function(){return(rd=a._emscripten_bind_b2Filter_set_groupIndex_1=a.asm.sb).apply(null,arguments)},sd=a._emscripten_bind_b2Filter___destroy___0=function(){return(sd=
a._emscripten_bind_b2Filter___destroy___0=a.asm.tb).apply(null,arguments)},td=a._emscripten_bind_JSQueryCallback_JSQueryCallback_0=function(){return(td=a._emscripten_bind_JSQueryCallback_JSQueryCallback_0=a.asm.ub).apply(null,arguments)},ud=a._emscripten_bind_JSQueryCallback_ReportFixture_1=function(){return(ud=a._emscripten_bind_JSQueryCallback_ReportFixture_1=a.asm.vb).apply(null,arguments)},vd=a._emscripten_bind_JSQueryCallback___destroy___0=function(){return(vd=a._emscripten_bind_JSQueryCallback___destroy___0=
a.asm.wb).apply(null,arguments)},wd=a._emscripten_bind_b2MouseJoint_SetTarget_1=function(){return(wd=a._emscripten_bind_b2MouseJoint_SetTarget_1=a.asm.xb).apply(null,arguments)},xd=a._emscripten_bind_b2MouseJoint_GetTarget_0=function(){return(xd=a._emscripten_bind_b2MouseJoint_GetTarget_0=a.asm.yb).apply(null,arguments)},yd=a._emscripten_bind_b2MouseJoint_SetMaxForce_1=function(){return(yd=a._emscripten_bind_b2MouseJoint_SetMaxForce_1=a.asm.zb).apply(null,arguments)},zd=a._emscripten_bind_b2MouseJoint_GetMaxForce_0=
function(){return(zd=a._emscripten_bind_b2MouseJoint_GetMaxForce_0=a.asm.Ab).apply(null,arguments)},Ad=a._emscripten_bind_b2MouseJoint_SetFrequency_1=function(){return(Ad=a._emscripten_bind_b2MouseJoint_SetFrequency_1=a.asm.Bb).apply(null,arguments)},Bd=a._emscripten_bind_b2MouseJoint_GetFrequency_0=function(){return(Bd=a._emscripten_bind_b2MouseJoint_GetFrequency_0=a.asm.Cb).apply(null,arguments)},Cd=a._emscripten_bind_b2MouseJoint_SetDampingRatio_1=function(){return(Cd=a._emscripten_bind_b2MouseJoint_SetDampingRatio_1=
a.asm.Db).apply(null,arguments)},Dd=a._emscripten_bind_b2MouseJoint_GetDampingRatio_0=function(){return(Dd=a._emscripten_bind_b2MouseJoint_GetDampingRatio_0=a.asm.Eb).apply(null,arguments)},Ed=a._emscripten_bind_b2MouseJoint_GetType_0=function(){return(Ed=a._emscripten_bind_b2MouseJoint_GetType_0=a.asm.Fb).apply(null,arguments)},Fd=a._emscripten_bind_b2MouseJoint_GetBodyA_0=function(){return(Fd=a._emscripten_bind_b2MouseJoint_GetBodyA_0=a.asm.Gb).apply(null,arguments)},Gd=a._emscripten_bind_b2MouseJoint_GetBodyB_0=
function(){return(Gd=a._emscripten_bind_b2MouseJoint_GetBodyB_0=a.asm.Hb).apply(null,arguments)},Hd=a._emscripten_bind_b2MouseJoint_GetAnchorA_0=function(){return(Hd=a._emscripten_bind_b2MouseJoint_GetAnchorA_0=a.asm.Ib).apply(null,arguments)},Id=a._emscripten_bind_b2MouseJoint_GetAnchorB_0=function(){return(Id=a._emscripten_bind_b2MouseJoint_GetAnchorB_0=a.asm.Jb).apply(null,arguments)},Jd=a._emscripten_bind_b2MouseJoint_GetReactionForce_1=function(){return(Jd=a._emscripten_bind_b2MouseJoint_GetReactionForce_1=
a.asm.Kb).apply(null,arguments)},Kd=a._emscripten_bind_b2MouseJoint_GetReactionTorque_1=function(){return(Kd=a._emscripten_bind_b2MouseJoint_GetReactionTorque_1=a.asm.Lb).apply(null,arguments)},Ld=a._emscripten_bind_b2MouseJoint_GetNext_0=function(){return(Ld=a._emscripten_bind_b2MouseJoint_GetNext_0=a.asm.Mb).apply(null,arguments)},Md=a._emscripten_bind_b2MouseJoint_GetUserData_0=function(){return(Md=a._emscripten_bind_b2MouseJoint_GetUserData_0=a.asm.Nb).apply(null,arguments)},Nd=a._emscripten_bind_b2MouseJoint_SetUserData_1=
function(){return(Nd=a._emscripten_bind_b2MouseJoint_SetUserData_1=a.asm.Ob).apply(null,arguments)},Od=a._emscripten_bind_b2MouseJoint_IsActive_0=function(){return(Od=a._emscripten_bind_b2MouseJoint_IsActive_0=a.asm.Pb).apply(null,arguments)},Pd=a._emscripten_bind_b2MouseJoint_GetCollideConnected_0=function(){return(Pd=a._emscripten_bind_b2MouseJoint_GetCollideConnected_0=a.asm.Qb).apply(null,arguments)},Qd=a._emscripten_bind_b2MouseJoint___destroy___0=function(){return(Qd=a._emscripten_bind_b2MouseJoint___destroy___0=
a.asm.Rb).apply(null,arguments)},Rd=a._emscripten_bind_b2Rot_b2Rot_0=function(){return(Rd=a._emscripten_bind_b2Rot_b2Rot_0=a.asm.Sb).apply(null,arguments)},Sd=a._emscripten_bind_b2Rot_b2Rot_1=function(){return(Sd=a._emscripten_bind_b2Rot_b2Rot_1=a.asm.Tb).apply(null,arguments)},Td=a._emscripten_bind_b2Rot_Set_1=function(){return(Td=a._emscripten_bind_b2Rot_Set_1=a.asm.Ub).apply(null,arguments)},Ud=a._emscripten_bind_b2Rot_SetIdentity_0=function(){return(Ud=a._emscripten_bind_b2Rot_SetIdentity_0=a.asm.Vb).apply(null,
arguments)},Vd=a._emscripten_bind_b2Rot_GetAngle_0=function(){return(Vd=a._emscripten_bind_b2Rot_GetAngle_0=a.asm.Wb).apply(null,arguments)},Wd=a._emscripten_bind_b2Rot_GetXAxis_0=function(){return(Wd=a._emscripten_bind_b2Rot_GetXAxis_0=a.asm.Xb).apply(null,arguments)},Xd=a._emscripten_bind_b2Rot_GetYAxis_0=function(){return(Xd=a._emscripten_bind_b2Rot_GetYAxis_0=a.asm.Yb).apply(null,arguments)},Yd=a._emscripten_bind_b2Rot_get_s_0=function(){return(Yd=a._emscripten_bind_b2Rot_get_s_0=a.asm.Zb).apply(null,
arguments)},Zd=a._emscripten_bind_b2Rot_set_s_1=function(){return(Zd=a._emscripten_bind_b2Rot_set_s_1=a.asm._b).apply(null,arguments)},$d=a._emscripten_bind_b2Rot_get_c_0=function(){return($d=a._emscripten_bind_b2Rot_get_c_0=a.asm.$b).apply(null,arguments)},ae=a._emscripten_bind_b2Rot_set_c_1=function(){return(ae=a._emscripten_bind_b2Rot_set_c_1=a.asm.ac).apply(null,arguments)},be=a._emscripten_bind_b2Rot___destroy___0=function(){return(be=a._emscripten_bind_b2Rot___destroy___0=a.asm.bc).apply(null,
arguments)},ce=a._emscripten_bind_b2MotorJoint_SetLinearOffset_1=function(){return(ce=a._emscripten_bind_b2MotorJoint_SetLinearOffset_1=a.asm.cc).apply(null,arguments)},de=a._emscripten_bind_b2MotorJoint_GetLinearOffset_0=function(){return(de=a._emscripten_bind_b2MotorJoint_GetLinearOffset_0=a.asm.dc).apply(null,arguments)},ee=a._emscripten_bind_b2MotorJoint_SetAngularOffset_1=function(){return(ee=a._emscripten_bind_b2MotorJoint_SetAngularOffset_1=a.asm.ec).apply(null,arguments)},fe=a._emscripten_bind_b2MotorJoint_GetAngularOffset_0=
function(){return(fe=a._emscripten_bind_b2MotorJoint_GetAngularOffset_0=a.asm.fc).apply(null,arguments)},ge=a._emscripten_bind_b2MotorJoint_SetMaxForce_1=function(){return(ge=a._emscripten_bind_b2MotorJoint_SetMaxForce_1=a.asm.gc).apply(null,arguments)},he=a._emscripten_bind_b2MotorJoint_GetMaxForce_0=function(){return(he=a._emscripten_bind_b2MotorJoint_GetMaxForce_0=a.asm.hc).apply(null,arguments)},ie=a._emscripten_bind_b2MotorJoint_SetMaxTorque_1=function(){return(ie=a._emscripten_bind_b2MotorJoint_SetMaxTorque_1=
a.asm.ic).apply(null,arguments)},je=a._emscripten_bind_b2MotorJoint_GetMaxTorque_0=function(){return(je=a._emscripten_bind_b2MotorJoint_GetMaxTorque_0=a.asm.jc).apply(null,arguments)},ke=a._emscripten_bind_b2MotorJoint_SetCorrectionFactor_1=function(){return(ke=a._emscripten_bind_b2MotorJoint_SetCorrectionFactor_1=a.asm.kc).apply(null,arguments)},le=a._emscripten_bind_b2MotorJoint_GetCorrectionFactor_0=function(){return(le=a._emscripten_bind_b2MotorJoint_GetCorrectionFactor_0=a.asm.lc).apply(null,
arguments)},me=a._emscripten_bind_b2MotorJoint_GetType_0=function(){return(me=a._emscripten_bind_b2MotorJoint_GetType_0=a.asm.mc).apply(null,arguments)},ne=a._emscripten_bind_b2MotorJoint_GetBodyA_0=function(){return(ne=a._emscripten_bind_b2MotorJoint_GetBodyA_0=a.asm.nc).apply(null,arguments)},oe=a._emscripten_bind_b2MotorJoint_GetBodyB_0=function(){return(oe=a._emscripten_bind_b2MotorJoint_GetBodyB_0=a.asm.oc).apply(null,arguments)},pe=a._emscripten_bind_b2MotorJoint_GetAnchorA_0=function(){return(pe=
a._emscripten_bind_b2MotorJoint_GetAnchorA_0=a.asm.pc).apply(null,arguments)},qe=a._emscripten_bind_b2MotorJoint_GetAnchorB_0=function(){return(qe=a._emscripten_bind_b2MotorJoint_GetAnchorB_0=a.asm.qc).apply(null,arguments)},re=a._emscripten_bind_b2MotorJoint_GetReactionForce_1=function(){return(re=a._emscripten_bind_b2MotorJoint_GetReactionForce_1=a.asm.rc).apply(null,arguments)},se=a._emscripten_bind_b2MotorJoint_GetReactionTorque_1=function(){return(se=a._emscripten_bind_b2MotorJoint_GetReactionTorque_1=
a.asm.sc).apply(null,arguments)},te=a._emscripten_bind_b2MotorJoint_GetNext_0=function(){return(te=a._emscripten_bind_b2MotorJoint_GetNext_0=a.asm.tc).apply(null,arguments)},ue=a._emscripten_bind_b2MotorJoint_GetUserData_0=function(){return(ue=a._emscripten_bind_b2MotorJoint_GetUserData_0=a.asm.uc).apply(null,arguments)},ve=a._emscripten_bind_b2MotorJoint_SetUserData_1=function(){return(ve=a._emscripten_bind_b2MotorJoint_SetUserData_1=a.asm.vc).apply(null,arguments)},we=a._emscripten_bind_b2MotorJoint_IsActive_0=
function(){return(we=a._emscripten_bind_b2MotorJoint_IsActive_0=a.asm.wc).apply(null,arguments)},xe=a._emscripten_bind_b2MotorJoint_GetCollideConnected_0=function(){return(xe=a._emscripten_bind_b2MotorJoint_GetCollideConnected_0=a.asm.xc).apply(null,arguments)},ye=a._emscripten_bind_b2MotorJoint___destroy___0=function(){return(ye=a._emscripten_bind_b2MotorJoint___destroy___0=a.asm.yc).apply(null,arguments)},ze=a._emscripten_bind_b2Profile_get_step_0=function(){return(ze=a._emscripten_bind_b2Profile_get_step_0=
a.asm.zc).apply(null,arguments)},Ae=a._emscripten_bind_b2Profile_set_step_1=function(){return(Ae=a._emscripten_bind_b2Profile_set_step_1=a.asm.Ac).apply(null,arguments)},Be=a._emscripten_bind_b2Profile_get_collide_0=function(){return(Be=a._emscripten_bind_b2Profile_get_collide_0=a.asm.Bc).apply(null,arguments)},Ce=a._emscripten_bind_b2Profile_set_collide_1=function(){return(Ce=a._emscripten_bind_b2Profile_set_collide_1=a.asm.Cc).apply(null,arguments)},De=a._emscripten_bind_b2Profile_get_solve_0=function(){return(De=
a._emscripten_bind_b2Profile_get_solve_0=a.asm.Dc).apply(null,arguments)},Ee=a._emscripten_bind_b2Profile_set_solve_1=function(){return(Ee=a._emscripten_bind_b2Profile_set_solve_1=a.asm.Ec).apply(null,arguments)},Fe=a._emscripten_bind_b2Profile_get_solveInit_0=function(){return(Fe=a._emscripten_bind_b2Profile_get_solveInit_0=a.asm.Fc).apply(null,arguments)},Ge=a._emscripten_bind_b2Profile_set_solveInit_1=function(){return(Ge=a._emscripten_bind_b2Profile_set_solveInit_1=a.asm.Gc).apply(null,arguments)},
He=a._emscripten_bind_b2Profile_get_solveVelocity_0=function(){return(He=a._emscripten_bind_b2Profile_get_solveVelocity_0=a.asm.Hc).apply(null,arguments)},Ie=a._emscripten_bind_b2Profile_set_solveVelocity_1=function(){return(Ie=a._emscripten_bind_b2Profile_set_solveVelocity_1=a.asm.Ic).apply(null,arguments)},Je=a._emscripten_bind_b2Profile_get_solvePosition_0=function(){return(Je=a._emscripten_bind_b2Profile_get_solvePosition_0=a.asm.Jc).apply(null,arguments)},Ke=a._emscripten_bind_b2Profile_set_solvePosition_1=
function(){return(Ke=a._emscripten_bind_b2Profile_set_solvePosition_1=a.asm.Kc).apply(null,arguments)},Le=a._emscripten_bind_b2Profile_get_broadphase_0=function(){return(Le=a._emscripten_bind_b2Profile_get_broadphase_0=a.asm.Lc).apply(null,arguments)},Me=a._emscripten_bind_b2Profile_set_broadphase_1=function(){return(Me=a._emscripten_bind_b2Profile_set_broadphase_1=a.asm.Mc).apply(null,arguments)},Ne=a._emscripten_bind_b2Profile_get_solveTOI_0=function(){return(Ne=a._emscripten_bind_b2Profile_get_solveTOI_0=
a.asm.Nc).apply(null,arguments)},Oe=a._emscripten_bind_b2Profile_set_solveTOI_1=function(){return(Oe=a._emscripten_bind_b2Profile_set_solveTOI_1=a.asm.Oc).apply(null,arguments)},Pe=a._emscripten_bind_b2Profile___destroy___0=function(){return(Pe=a._emscripten_bind_b2Profile___destroy___0=a.asm.Pc).apply(null,arguments)},Qe=a._emscripten_bind_VoidPtr___destroy___0=function(){return(Qe=a._emscripten_bind_VoidPtr___destroy___0=a.asm.Qc).apply(null,arguments)},Re=a._emscripten_bind_b2BodyDef_b2BodyDef_0=
function(){return(Re=a._emscripten_bind_b2BodyDef_b2BodyDef_0=a.asm.Rc).apply(null,arguments)},Se=a._emscripten_bind_b2BodyDef_get_type_0=function(){return(Se=a._emscripten_bind_b2BodyDef_get_type_0=a.asm.Sc).apply(null,arguments)},Te=a._emscripten_bind_b2BodyDef_set_type_1=function(){return(Te=a._emscripten_bind_b2BodyDef_set_type_1=a.asm.Tc).apply(null,arguments)},Ue=a._emscripten_bind_b2BodyDef_get_position_0=function(){return(Ue=a._emscripten_bind_b2BodyDef_get_position_0=a.asm.Uc).apply(null,
arguments)},Ve=a._emscripten_bind_b2BodyDef_set_position_1=function(){return(Ve=a._emscripten_bind_b2BodyDef_set_position_1=a.asm.Vc).apply(null,arguments)},We=a._emscripten_bind_b2BodyDef_get_angle_0=function(){return(We=a._emscripten_bind_b2BodyDef_get_angle_0=a.asm.Wc).apply(null,arguments)},Xe=a._emscripten_bind_b2BodyDef_set_angle_1=function(){return(Xe=a._emscripten_bind_b2BodyDef_set_angle_1=a.asm.Xc).apply(null,arguments)},Ye=a._emscripten_bind_b2BodyDef_get_linearVelocity_0=function(){return(Ye=
a._emscripten_bind_b2BodyDef_get_linearVelocity_0=a.asm.Yc).apply(null,arguments)},Ze=a._emscripten_bind_b2BodyDef_set_linearVelocity_1=function(){return(Ze=a._emscripten_bind_b2BodyDef_set_linearVelocity_1=a.asm.Zc).apply(null,arguments)},$e=a._emscripten_bind_b2BodyDef_get_angularVelocity_0=function(){return($e=a._emscripten_bind_b2BodyDef_get_angularVelocity_0=a.asm._c).apply(null,arguments)},af=a._emscripten_bind_b2BodyDef_set_angularVelocity_1=function(){return(af=a._emscripten_bind_b2BodyDef_set_angularVelocity_1=
a.asm.$c).apply(null,arguments)},bf=a._emscripten_bind_b2BodyDef_get_linearDamping_0=function(){return(bf=a._emscripten_bind_b2BodyDef_get_linearDamping_0=a.asm.ad).apply(null,arguments)},cf=a._emscripten_bind_b2BodyDef_set_linearDamping_1=function(){return(cf=a._emscripten_bind_b2BodyDef_set_linearDamping_1=a.asm.bd).apply(null,arguments)},df=a._emscripten_bind_b2BodyDef_get_angularDamping_0=function(){return(df=a._emscripten_bind_b2BodyDef_get_angularDamping_0=a.asm.cd).apply(null,arguments)},ef=
a._emscripten_bind_b2BodyDef_set_angularDamping_1=function(){return(ef=a._emscripten_bind_b2BodyDef_set_angularDamping_1=a.asm.dd).apply(null,arguments)},ff=a._emscripten_bind_b2BodyDef_get_allowSleep_0=function(){return(ff=a._emscripten_bind_b2BodyDef_get_allowSleep_0=a.asm.ed).apply(null,arguments)},gf=a._emscripten_bind_b2BodyDef_set_allowSleep_1=function(){return(gf=a._emscripten_bind_b2BodyDef_set_allowSleep_1=a.asm.fd).apply(null,arguments)},hf=a._emscripten_bind_b2BodyDef_get_awake_0=function(){return(hf=
a._emscripten_bind_b2BodyDef_get_awake_0=a.asm.gd).apply(null,arguments)},jf=a._emscripten_bind_b2BodyDef_set_awake_1=function(){return(jf=a._emscripten_bind_b2BodyDef_set_awake_1=a.asm.hd).apply(null,arguments)},kf=a._emscripten_bind_b2BodyDef_get_fixedRotation_0=function(){return(kf=a._emscripten_bind_b2BodyDef_get_fixedRotation_0=a.asm.id).apply(null,arguments)},lf=a._emscripten_bind_b2BodyDef_set_fixedRotation_1=function(){return(lf=a._emscripten_bind_b2BodyDef_set_fixedRotation_1=a.asm.jd).apply(null,
arguments)},mf=a._emscripten_bind_b2BodyDef_get_bullet_0=function(){return(mf=a._emscripten_bind_b2BodyDef_get_bullet_0=a.asm.kd).apply(null,arguments)},nf=a._emscripten_bind_b2BodyDef_set_bullet_1=function(){return(nf=a._emscripten_bind_b2BodyDef_set_bullet_1=a.asm.ld).apply(null,arguments)},of=a._emscripten_bind_b2BodyDef_get_active_0=function(){return(of=a._emscripten_bind_b2BodyDef_get_active_0=a.asm.md).apply(null,arguments)},pf=a._emscripten_bind_b2BodyDef_set_active_1=function(){return(pf=
a._emscripten_bind_b2BodyDef_set_active_1=a.asm.nd).apply(null,arguments)},qf=a._emscripten_bind_b2BodyDef_get_userData_0=function(){return(qf=a._emscripten_bind_b2BodyDef_get_userData_0=a.asm.od).apply(null,arguments)},rf=a._emscripten_bind_b2BodyDef_set_userData_1=function(){return(rf=a._emscripten_bind_b2BodyDef_set_userData_1=a.asm.pd).apply(null,arguments)},sf=a._emscripten_bind_b2BodyDef_get_gravityScale_0=function(){return(sf=a._emscripten_bind_b2BodyDef_get_gravityScale_0=a.asm.qd).apply(null,
arguments)},tf=a._emscripten_bind_b2BodyDef_set_gravityScale_1=function(){return(tf=a._emscripten_bind_b2BodyDef_set_gravityScale_1=a.asm.rd).apply(null,arguments)},uf=a._emscripten_bind_b2BodyDef___destroy___0=function(){return(uf=a._emscripten_bind_b2BodyDef___destroy___0=a.asm.sd).apply(null,arguments)},vf=a._emscripten_bind_JSRayCastCallback_JSRayCastCallback_0=function(){return(vf=a._emscripten_bind_JSRayCastCallback_JSRayCastCallback_0=a.asm.td).apply(null,arguments)},wf=a._emscripten_bind_JSRayCastCallback_ReportFixture_4=
function(){return(wf=a._emscripten_bind_JSRayCastCallback_ReportFixture_4=a.asm.ud).apply(null,arguments)},xf=a._emscripten_bind_JSRayCastCallback___destroy___0=function(){return(xf=a._emscripten_bind_JSRayCastCallback___destroy___0=a.asm.vd).apply(null,arguments)},yf=a._emscripten_bind_b2ContactFeature_get_indexA_0=function(){return(yf=a._emscripten_bind_b2ContactFeature_get_indexA_0=a.asm.wd).apply(null,arguments)},zf=a._emscripten_bind_b2ContactFeature_set_indexA_1=function(){return(zf=a._emscripten_bind_b2ContactFeature_set_indexA_1=
a.asm.xd).apply(null,arguments)},Af=a._emscripten_bind_b2ContactFeature_get_indexB_0=function(){return(Af=a._emscripten_bind_b2ContactFeature_get_indexB_0=a.asm.yd).apply(null,arguments)},Bf=a._emscripten_bind_b2ContactFeature_set_indexB_1=function(){return(Bf=a._emscripten_bind_b2ContactFeature_set_indexB_1=a.asm.zd).apply(null,arguments)},Cf=a._emscripten_bind_b2ContactFeature_get_typeA_0=function(){return(Cf=a._emscripten_bind_b2ContactFeature_get_typeA_0=a.asm.Ad).apply(null,arguments)},Df=a._emscripten_bind_b2ContactFeature_set_typeA_1=
function(){return(Df=a._emscripten_bind_b2ContactFeature_set_typeA_1=a.asm.Bd).apply(null,arguments)},Ef=a._emscripten_bind_b2ContactFeature_get_typeB_0=function(){return(Ef=a._emscripten_bind_b2ContactFeature_get_typeB_0=a.asm.Cd).apply(null,arguments)},Ff=a._emscripten_bind_b2ContactFeature_set_typeB_1=function(){return(Ff=a._emscripten_bind_b2ContactFeature_set_typeB_1=a.asm.Dd).apply(null,arguments)},Gf=a._emscripten_bind_b2ContactFeature___destroy___0=function(){return(Gf=a._emscripten_bind_b2ContactFeature___destroy___0=
a.asm.Ed).apply(null,arguments)},Hf=a._emscripten_bind_b2Vec2_b2Vec2_0=function(){return(Hf=a._emscripten_bind_b2Vec2_b2Vec2_0=a.asm.Fd).apply(null,arguments)},If=a._emscripten_bind_b2Vec2_b2Vec2_2=function(){return(If=a._emscripten_bind_b2Vec2_b2Vec2_2=a.asm.Gd).apply(null,arguments)},Jf=a._emscripten_bind_b2Vec2_SetZero_0=function(){return(Jf=a._emscripten_bind_b2Vec2_SetZero_0=a.asm.Hd).apply(null,arguments)},Kf=a._emscripten_bind_b2Vec2_Set_2=function(){return(Kf=a._emscripten_bind_b2Vec2_Set_2=
a.asm.Id).apply(null,arguments)},Lf=a._emscripten_bind_b2Vec2_op_add_1=function(){return(Lf=a._emscripten_bind_b2Vec2_op_add_1=a.asm.Jd).apply(null,arguments)},Mf=a._emscripten_bind_b2Vec2_op_sub_1=function(){return(Mf=a._emscripten_bind_b2Vec2_op_sub_1=a.asm.Kd).apply(null,arguments)},Nf=a._emscripten_bind_b2Vec2_op_mul_1=function(){return(Nf=a._emscripten_bind_b2Vec2_op_mul_1=a.asm.Ld).apply(null,arguments)},Of=a._emscripten_bind_b2Vec2_Length_0=function(){return(Of=a._emscripten_bind_b2Vec2_Length_0=
a.asm.Md).apply(null,arguments)},Pf=a._emscripten_bind_b2Vec2_LengthSquared_0=function(){return(Pf=a._emscripten_bind_b2Vec2_LengthSquared_0=a.asm.Nd).apply(null,arguments)},Qf=a._emscripten_bind_b2Vec2_Normalize_0=function(){return(Qf=a._emscripten_bind_b2Vec2_Normalize_0=a.asm.Od).apply(null,arguments)},Rf=a._emscripten_bind_b2Vec2_IsValid_0=function(){return(Rf=a._emscripten_bind_b2Vec2_IsValid_0=a.asm.Pd).apply(null,arguments)},Sf=a._emscripten_bind_b2Vec2_Skew_0=function(){return(Sf=a._emscripten_bind_b2Vec2_Skew_0=
a.asm.Qd).apply(null,arguments)},Tf=a._emscripten_bind_b2Vec2_get_x_0=function(){return(Tf=a._emscripten_bind_b2Vec2_get_x_0=a.asm.Rd).apply(null,arguments)},Uf=a._emscripten_bind_b2Vec2_set_x_1=function(){return(Uf=a._emscripten_bind_b2Vec2_set_x_1=a.asm.Sd).apply(null,arguments)},Vf=a._emscripten_bind_b2Vec2_get_y_0=function(){return(Vf=a._emscripten_bind_b2Vec2_get_y_0=a.asm.Td).apply(null,arguments)},Wf=a._emscripten_bind_b2Vec2_set_y_1=function(){return(Wf=a._emscripten_bind_b2Vec2_set_y_1=a.asm.Ud).apply(null,
arguments)},Xf=a._emscripten_bind_b2Vec2___destroy___0=function(){return(Xf=a._emscripten_bind_b2Vec2___destroy___0=a.asm.Vd).apply(null,arguments)},Yf=a._emscripten_bind_b2Vec3_b2Vec3_0=function(){return(Yf=a._emscripten_bind_b2Vec3_b2Vec3_0=a.asm.Wd).apply(null,arguments)},Zf=a._emscripten_bind_b2Vec3_b2Vec3_3=function(){return(Zf=a._emscripten_bind_b2Vec3_b2Vec3_3=a.asm.Xd).apply(null,arguments)},$f=a._emscripten_bind_b2Vec3_SetZero_0=function(){return($f=a._emscripten_bind_b2Vec3_SetZero_0=a.asm.Yd).apply(null,
arguments)},ag=a._emscripten_bind_b2Vec3_Set_3=function(){return(ag=a._emscripten_bind_b2Vec3_Set_3=a.asm.Zd).apply(null,arguments)},bg=a._emscripten_bind_b2Vec3_op_add_1=function(){return(bg=a._emscripten_bind_b2Vec3_op_add_1=a.asm._d).apply(null,arguments)},cg=a._emscripten_bind_b2Vec3_op_sub_1=function(){return(cg=a._emscripten_bind_b2Vec3_op_sub_1=a.asm.$d).apply(null,arguments)},dg=a._emscripten_bind_b2Vec3_op_mul_1=function(){return(dg=a._emscripten_bind_b2Vec3_op_mul_1=a.asm.ae).apply(null,
arguments)},eg=a._emscripten_bind_b2Vec3_get_x_0=function(){return(eg=a._emscripten_bind_b2Vec3_get_x_0=a.asm.be).apply(null,arguments)},fg=a._emscripten_bind_b2Vec3_set_x_1=function(){return(fg=a._emscripten_bind_b2Vec3_set_x_1=a.asm.ce).apply(null,arguments)},gg=a._emscripten_bind_b2Vec3_get_y_0=function(){return(gg=a._emscripten_bind_b2Vec3_get_y_0=a.asm.de).apply(null,arguments)},hg=a._emscripten_bind_b2Vec3_set_y_1=function(){return(hg=a._emscripten_bind_b2Vec3_set_y_1=a.asm.ee).apply(null,arguments)},
ig=a._emscripten_bind_b2Vec3_get_z_0=function(){return(ig=a._emscripten_bind_b2Vec3_get_z_0=a.asm.fe).apply(null,arguments)},jg=a._emscripten_bind_b2Vec3_set_z_1=function(){return(jg=a._emscripten_bind_b2Vec3_set_z_1=a.asm.ge).apply(null,arguments)},kg=a._emscripten_bind_b2Vec3___destroy___0=function(){return(kg=a._emscripten_bind_b2Vec3___destroy___0=a.asm.he).apply(null,arguments)},lg=a._emscripten_bind_b2AABB_b2AABB_0=function(){return(lg=a._emscripten_bind_b2AABB_b2AABB_0=a.asm.ie).apply(null,
arguments)},mg=a._emscripten_bind_b2AABB_IsValid_0=function(){return(mg=a._emscripten_bind_b2AABB_IsValid_0=a.asm.je).apply(null,arguments)},ng=a._emscripten_bind_b2AABB_GetCenter_0=function(){return(ng=a._emscripten_bind_b2AABB_GetCenter_0=a.asm.ke).apply(null,arguments)},og=a._emscripten_bind_b2AABB_GetExtents_0=function(){return(og=a._emscripten_bind_b2AABB_GetExtents_0=a.asm.le).apply(null,arguments)},pg=a._emscripten_bind_b2AABB_GetPerimeter_0=function(){return(pg=a._emscripten_bind_b2AABB_GetPerimeter_0=
a.asm.me).apply(null,arguments)},qg=a._emscripten_bind_b2AABB_Combine_1=function(){return(qg=a._emscripten_bind_b2AABB_Combine_1=a.asm.ne).apply(null,arguments)},rg=a._emscripten_bind_b2AABB_Combine_2=function(){return(rg=a._emscripten_bind_b2AABB_Combine_2=a.asm.oe).apply(null,arguments)},sg=a._emscripten_bind_b2AABB_Contains_1=function(){return(sg=a._emscripten_bind_b2AABB_Contains_1=a.asm.pe).apply(null,arguments)},tg=a._emscripten_bind_b2AABB_RayCast_2=function(){return(tg=a._emscripten_bind_b2AABB_RayCast_2=
a.asm.qe).apply(null,arguments)},ug=a._emscripten_bind_b2AABB_get_lowerBound_0=function(){return(ug=a._emscripten_bind_b2AABB_get_lowerBound_0=a.asm.re).apply(null,arguments)},vg=a._emscripten_bind_b2AABB_set_lowerBound_1=function(){return(vg=a._emscripten_bind_b2AABB_set_lowerBound_1=a.asm.se).apply(null,arguments)},wg=a._emscripten_bind_b2AABB_get_upperBound_0=function(){return(wg=a._emscripten_bind_b2AABB_get_upperBound_0=a.asm.te).apply(null,arguments)},xg=a._emscripten_bind_b2AABB_set_upperBound_1=
function(){return(xg=a._emscripten_bind_b2AABB_set_upperBound_1=a.asm.ue).apply(null,arguments)},yg=a._emscripten_bind_b2AABB___destroy___0=function(){return(yg=a._emscripten_bind_b2AABB___destroy___0=a.asm.ve).apply(null,arguments)},zg=a._emscripten_bind_b2FixtureDef_b2FixtureDef_0=function(){return(zg=a._emscripten_bind_b2FixtureDef_b2FixtureDef_0=a.asm.we).apply(null,arguments)},Ag=a._emscripten_bind_b2FixtureDef_get_shape_0=function(){return(Ag=a._emscripten_bind_b2FixtureDef_get_shape_0=a.asm.xe).apply(null,
arguments)},Bg=a._emscripten_bind_b2FixtureDef_set_shape_1=function(){return(Bg=a._emscripten_bind_b2FixtureDef_set_shape_1=a.asm.ye).apply(null,arguments)},Cg=a._emscripten_bind_b2FixtureDef_get_userData_0=function(){return(Cg=a._emscripten_bind_b2FixtureDef_get_userData_0=a.asm.ze).apply(null,arguments)},Dg=a._emscripten_bind_b2FixtureDef_set_userData_1=function(){return(Dg=a._emscripten_bind_b2FixtureDef_set_userData_1=a.asm.Ae).apply(null,arguments)},Eg=a._emscripten_bind_b2FixtureDef_get_friction_0=
function(){return(Eg=a._emscripten_bind_b2FixtureDef_get_friction_0=a.asm.Be).apply(null,arguments)},Fg=a._emscripten_bind_b2FixtureDef_set_friction_1=function(){return(Fg=a._emscripten_bind_b2FixtureDef_set_friction_1=a.asm.Ce).apply(null,arguments)},Gg=a._emscripten_bind_b2FixtureDef_get_restitution_0=function(){return(Gg=a._emscripten_bind_b2FixtureDef_get_restitution_0=a.asm.De).apply(null,arguments)},Hg=a._emscripten_bind_b2FixtureDef_set_restitution_1=function(){return(Hg=a._emscripten_bind_b2FixtureDef_set_restitution_1=
a.asm.Ee).apply(null,arguments)},Ig=a._emscripten_bind_b2FixtureDef_get_density_0=function(){return(Ig=a._emscripten_bind_b2FixtureDef_get_density_0=a.asm.Fe).apply(null,arguments)},Jg=a._emscripten_bind_b2FixtureDef_set_density_1=function(){return(Jg=a._emscripten_bind_b2FixtureDef_set_density_1=a.asm.Ge).apply(null,arguments)},Kg=a._emscripten_bind_b2FixtureDef_get_isSensor_0=function(){return(Kg=a._emscripten_bind_b2FixtureDef_get_isSensor_0=a.asm.He).apply(null,arguments)},Lg=a._emscripten_bind_b2FixtureDef_set_isSensor_1=
function(){return(Lg=a._emscripten_bind_b2FixtureDef_set_isSensor_1=a.asm.Ie).apply(null,arguments)},Mg=a._emscripten_bind_b2FixtureDef_get_filter_0=function(){return(Mg=a._emscripten_bind_b2FixtureDef_get_filter_0=a.asm.Je).apply(null,arguments)},Ng=a._emscripten_bind_b2FixtureDef_set_filter_1=function(){return(Ng=a._emscripten_bind_b2FixtureDef_set_filter_1=a.asm.Ke).apply(null,arguments)},Og=a._emscripten_bind_b2FixtureDef___destroy___0=function(){return(Og=a._emscripten_bind_b2FixtureDef___destroy___0=
a.asm.Le).apply(null,arguments)},Pg=a._emscripten_bind_b2FrictionJointDef_b2FrictionJointDef_0=function(){return(Pg=a._emscripten_bind_b2FrictionJointDef_b2FrictionJointDef_0=a.asm.Me).apply(null,arguments)},Qg=a._emscripten_bind_b2FrictionJointDef_Initialize_3=function(){return(Qg=a._emscripten_bind_b2FrictionJointDef_Initialize_3=a.asm.Ne).apply(null,arguments)},Rg=a._emscripten_bind_b2FrictionJointDef_get_localAnchorA_0=function(){return(Rg=a._emscripten_bind_b2FrictionJointDef_get_localAnchorA_0=
a.asm.Oe).apply(null,arguments)},Sg=a._emscripten_bind_b2FrictionJointDef_set_localAnchorA_1=function(){return(Sg=a._emscripten_bind_b2FrictionJointDef_set_localAnchorA_1=a.asm.Pe).apply(null,arguments)},Tg=a._emscripten_bind_b2FrictionJointDef_get_localAnchorB_0=function(){return(Tg=a._emscripten_bind_b2FrictionJointDef_get_localAnchorB_0=a.asm.Qe).apply(null,arguments)},Ug=a._emscripten_bind_b2FrictionJointDef_set_localAnchorB_1=function(){return(Ug=a._emscripten_bind_b2FrictionJointDef_set_localAnchorB_1=
a.asm.Re).apply(null,arguments)},Vg=a._emscripten_bind_b2FrictionJointDef_get_maxForce_0=function(){return(Vg=a._emscripten_bind_b2FrictionJointDef_get_maxForce_0=a.asm.Se).apply(null,arguments)},Wg=a._emscripten_bind_b2FrictionJointDef_set_maxForce_1=function(){return(Wg=a._emscripten_bind_b2FrictionJointDef_set_maxForce_1=a.asm.Te).apply(null,arguments)},Xg=a._emscripten_bind_b2FrictionJointDef_get_maxTorque_0=function(){return(Xg=a._emscripten_bind_b2FrictionJointDef_get_maxTorque_0=a.asm.Ue).apply(null,
arguments)},Yg=a._emscripten_bind_b2FrictionJointDef_set_maxTorque_1=function(){return(Yg=a._emscripten_bind_b2FrictionJointDef_set_maxTorque_1=a.asm.Ve).apply(null,arguments)},Zg=a._emscripten_bind_b2FrictionJointDef_get_type_0=function(){return(Zg=a._emscripten_bind_b2FrictionJointDef_get_type_0=a.asm.We).apply(null,arguments)},$g=a._emscripten_bind_b2FrictionJointDef_set_type_1=function(){return($g=a._emscripten_bind_b2FrictionJointDef_set_type_1=a.asm.Xe).apply(null,arguments)},ah=a._emscripten_bind_b2FrictionJointDef_get_userData_0=
function(){return(ah=a._emscripten_bind_b2FrictionJointDef_get_userData_0=a.asm.Ye).apply(null,arguments)},bh=a._emscripten_bind_b2FrictionJointDef_set_userData_1=function(){return(bh=a._emscripten_bind_b2FrictionJointDef_set_userData_1=a.asm.Ze).apply(null,arguments)},ch=a._emscripten_bind_b2FrictionJointDef_get_bodyA_0=function(){return(ch=a._emscripten_bind_b2FrictionJointDef_get_bodyA_0=a.asm._e).apply(null,arguments)},dh=a._emscripten_bind_b2FrictionJointDef_set_bodyA_1=function(){return(dh=
a._emscripten_bind_b2FrictionJointDef_set_bodyA_1=a.asm.$e).apply(null,arguments)},eh=a._emscripten_bind_b2FrictionJointDef_get_bodyB_0=function(){return(eh=a._emscripten_bind_b2FrictionJointDef_get_bodyB_0=a.asm.af).apply(null,arguments)},fh=a._emscripten_bind_b2FrictionJointDef_set_bodyB_1=function(){return(fh=a._emscripten_bind_b2FrictionJointDef_set_bodyB_1=a.asm.bf).apply(null,arguments)},gh=a._emscripten_bind_b2FrictionJointDef_get_collideConnected_0=function(){return(gh=a._emscripten_bind_b2FrictionJointDef_get_collideConnected_0=
a.asm.cf).apply(null,arguments)},hh=a._emscripten_bind_b2FrictionJointDef_set_collideConnected_1=function(){return(hh=a._emscripten_bind_b2FrictionJointDef_set_collideConnected_1=a.asm.df).apply(null,arguments)},ih=a._emscripten_bind_b2FrictionJointDef___destroy___0=function(){return(ih=a._emscripten_bind_b2FrictionJointDef___destroy___0=a.asm.ef).apply(null,arguments)},jh=a._emscripten_bind_b2Manifold_b2Manifold_0=function(){return(jh=a._emscripten_bind_b2Manifold_b2Manifold_0=a.asm.ff).apply(null,
arguments)},kh=a._emscripten_bind_b2Manifold_get_localNormal_0=function(){return(kh=a._emscripten_bind_b2Manifold_get_localNormal_0=a.asm.gf).apply(null,arguments)},lh=a._emscripten_bind_b2Manifold_set_localNormal_1=function(){return(lh=a._emscripten_bind_b2Manifold_set_localNormal_1=a.asm.hf).apply(null,arguments)},mh=a._emscripten_bind_b2Manifold_get_localPoint_0=function(){return(mh=a._emscripten_bind_b2Manifold_get_localPoint_0=a.asm.jf).apply(null,arguments)},nh=a._emscripten_bind_b2Manifold_set_localPoint_1=
function(){return(nh=a._emscripten_bind_b2Manifold_set_localPoint_1=a.asm.kf).apply(null,arguments)},oh=a._emscripten_bind_b2Manifold_get_type_0=function(){return(oh=a._emscripten_bind_b2Manifold_get_type_0=a.asm.lf).apply(null,arguments)},ph=a._emscripten_bind_b2Manifold_set_type_1=function(){return(ph=a._emscripten_bind_b2Manifold_set_type_1=a.asm.mf).apply(null,arguments)},qh=a._emscripten_bind_b2Manifold_get_pointCount_0=function(){return(qh=a._emscripten_bind_b2Manifold_get_pointCount_0=a.asm.nf).apply(null,
arguments)},rh=a._emscripten_bind_b2Manifold_set_pointCount_1=function(){return(rh=a._emscripten_bind_b2Manifold_set_pointCount_1=a.asm.of).apply(null,arguments)},sh=a._emscripten_bind_b2Manifold___destroy___0=function(){return(sh=a._emscripten_bind_b2Manifold___destroy___0=a.asm.pf).apply(null,arguments)},th=a._emscripten_bind_b2WorldManifold_b2WorldManifold_0=function(){return(th=a._emscripten_bind_b2WorldManifold_b2WorldManifold_0=a.asm.qf).apply(null,arguments)},uh=a._emscripten_bind_b2WorldManifold_Initialize_5=
function(){return(uh=a._emscripten_bind_b2WorldManifold_Initialize_5=a.asm.rf).apply(null,arguments)},vh=a._emscripten_bind_b2WorldManifold_get_normal_0=function(){return(vh=a._emscripten_bind_b2WorldManifold_get_normal_0=a.asm.sf).apply(null,arguments)},wh=a._emscripten_bind_b2WorldManifold_set_normal_1=function(){return(wh=a._emscripten_bind_b2WorldManifold_set_normal_1=a.asm.tf).apply(null,arguments)},xh=a._emscripten_bind_b2WorldManifold_get_points_1=function(){return(xh=a._emscripten_bind_b2WorldManifold_get_points_1=
a.asm.uf).apply(null,arguments)},yh=a._emscripten_bind_b2WorldManifold_set_points_2=function(){return(yh=a._emscripten_bind_b2WorldManifold_set_points_2=a.asm.vf).apply(null,arguments)},zh=a._emscripten_bind_b2WorldManifold_get_separations_1=function(){return(zh=a._emscripten_bind_b2WorldManifold_get_separations_1=a.asm.wf).apply(null,arguments)},Ah=a._emscripten_bind_b2WorldManifold_set_separations_2=function(){return(Ah=a._emscripten_bind_b2WorldManifold_set_separations_2=a.asm.xf).apply(null,arguments)},
Bh=a._emscripten_bind_b2WorldManifold___destroy___0=function(){return(Bh=a._emscripten_bind_b2WorldManifold___destroy___0=a.asm.yf).apply(null,arguments)},Ch=a._emscripten_bind_b2PrismaticJointDef_b2PrismaticJointDef_0=function(){return(Ch=a._emscripten_bind_b2PrismaticJointDef_b2PrismaticJointDef_0=a.asm.zf).apply(null,arguments)},Dh=a._emscripten_bind_b2PrismaticJointDef_Initialize_4=function(){return(Dh=a._emscripten_bind_b2PrismaticJointDef_Initialize_4=a.asm.Af).apply(null,arguments)},Eh=a._emscripten_bind_b2PrismaticJointDef_get_localAnchorA_0=
function(){return(Eh=a._emscripten_bind_b2PrismaticJointDef_get_localAnchorA_0=a.asm.Bf).apply(null,arguments)},Fh=a._emscripten_bind_b2PrismaticJointDef_set_localAnchorA_1=function(){return(Fh=a._emscripten_bind_b2PrismaticJointDef_set_localAnchorA_1=a.asm.Cf).apply(null,arguments)},Gh=a._emscripten_bind_b2PrismaticJointDef_get_localAnchorB_0=function(){return(Gh=a._emscripten_bind_b2PrismaticJointDef_get_localAnchorB_0=a.asm.Df).apply(null,arguments)},Hh=a._emscripten_bind_b2PrismaticJointDef_set_localAnchorB_1=
function(){return(Hh=a._emscripten_bind_b2PrismaticJointDef_set_localAnchorB_1=a.asm.Ef).apply(null,arguments)},Ih=a._emscripten_bind_b2PrismaticJointDef_get_localAxisA_0=function(){return(Ih=a._emscripten_bind_b2PrismaticJointDef_get_localAxisA_0=a.asm.Ff).apply(null,arguments)},Jh=a._emscripten_bind_b2PrismaticJointDef_set_localAxisA_1=function(){return(Jh=a._emscripten_bind_b2PrismaticJointDef_set_localAxisA_1=a.asm.Gf).apply(null,arguments)},Kh=a._emscripten_bind_b2PrismaticJointDef_get_referenceAngle_0=
function(){return(Kh=a._emscripten_bind_b2PrismaticJointDef_get_referenceAngle_0=a.asm.Hf).apply(null,arguments)},Lh=a._emscripten_bind_b2PrismaticJointDef_set_referenceAngle_1=function(){return(Lh=a._emscripten_bind_b2PrismaticJointDef_set_referenceAngle_1=a.asm.If).apply(null,arguments)},Mh=a._emscripten_bind_b2PrismaticJointDef_get_enableLimit_0=function(){return(Mh=a._emscripten_bind_b2PrismaticJointDef_get_enableLimit_0=a.asm.Jf).apply(null,arguments)},Nh=a._emscripten_bind_b2PrismaticJointDef_set_enableLimit_1=
function(){return(Nh=a._emscripten_bind_b2PrismaticJointDef_set_enableLimit_1=a.asm.Kf).apply(null,arguments)},Oh=a._emscripten_bind_b2PrismaticJointDef_get_lowerTranslation_0=function(){return(Oh=a._emscripten_bind_b2PrismaticJointDef_get_lowerTranslation_0=a.asm.Lf).apply(null,arguments)},Ph=a._emscripten_bind_b2PrismaticJointDef_set_lowerTranslation_1=function(){return(Ph=a._emscripten_bind_b2PrismaticJointDef_set_lowerTranslation_1=a.asm.Mf).apply(null,arguments)},Qh=a._emscripten_bind_b2PrismaticJointDef_get_upperTranslation_0=
function(){return(Qh=a._emscripten_bind_b2PrismaticJointDef_get_upperTranslation_0=a.asm.Nf).apply(null,arguments)},Rh=a._emscripten_bind_b2PrismaticJointDef_set_upperTranslation_1=function(){return(Rh=a._emscripten_bind_b2PrismaticJointDef_set_upperTranslation_1=a.asm.Of).apply(null,arguments)},Sh=a._emscripten_bind_b2PrismaticJointDef_get_enableMotor_0=function(){return(Sh=a._emscripten_bind_b2PrismaticJointDef_get_enableMotor_0=a.asm.Pf).apply(null,arguments)},Th=a._emscripten_bind_b2PrismaticJointDef_set_enableMotor_1=
function(){return(Th=a._emscripten_bind_b2PrismaticJointDef_set_enableMotor_1=a.asm.Qf).apply(null,arguments)},Uh=a._emscripten_bind_b2PrismaticJointDef_get_maxMotorForce_0=function(){return(Uh=a._emscripten_bind_b2PrismaticJointDef_get_maxMotorForce_0=a.asm.Rf).apply(null,arguments)},Vh=a._emscripten_bind_b2PrismaticJointDef_set_maxMotorForce_1=function(){return(Vh=a._emscripten_bind_b2PrismaticJointDef_set_maxMotorForce_1=a.asm.Sf).apply(null,arguments)},Wh=a._emscripten_bind_b2PrismaticJointDef_get_motorSpeed_0=
function(){return(Wh=a._emscripten_bind_b2PrismaticJointDef_get_motorSpeed_0=a.asm.Tf).apply(null,arguments)},Xh=a._emscripten_bind_b2PrismaticJointDef_set_motorSpeed_1=function(){return(Xh=a._emscripten_bind_b2PrismaticJointDef_set_motorSpeed_1=a.asm.Uf).apply(null,arguments)},Yh=a._emscripten_bind_b2PrismaticJointDef_get_type_0=function(){return(Yh=a._emscripten_bind_b2PrismaticJointDef_get_type_0=a.asm.Vf).apply(null,arguments)},Zh=a._emscripten_bind_b2PrismaticJointDef_set_type_1=function(){return(Zh=
a._emscripten_bind_b2PrismaticJointDef_set_type_1=a.asm.Wf).apply(null,arguments)},$h=a._emscripten_bind_b2PrismaticJointDef_get_userData_0=function(){return($h=a._emscripten_bind_b2PrismaticJointDef_get_userData_0=a.asm.Xf).apply(null,arguments)},ai=a._emscripten_bind_b2PrismaticJointDef_set_userData_1=function(){return(ai=a._emscripten_bind_b2PrismaticJointDef_set_userData_1=a.asm.Yf).apply(null,arguments)},bi=a._emscripten_bind_b2PrismaticJointDef_get_bodyA_0=function(){return(bi=a._emscripten_bind_b2PrismaticJointDef_get_bodyA_0=
a.asm.Zf).apply(null,arguments)},ci=a._emscripten_bind_b2PrismaticJointDef_set_bodyA_1=function(){return(ci=a._emscripten_bind_b2PrismaticJointDef_set_bodyA_1=a.asm._f).apply(null,arguments)},di=a._emscripten_bind_b2PrismaticJointDef_get_bodyB_0=function(){return(di=a._emscripten_bind_b2PrismaticJointDef_get_bodyB_0=a.asm.$f).apply(null,arguments)},ei=a._emscripten_bind_b2PrismaticJointDef_set_bodyB_1=function(){return(ei=a._emscripten_bind_b2PrismaticJointDef_set_bodyB_1=a.asm.ag).apply(null,arguments)},
fi=a._emscripten_bind_b2PrismaticJointDef_get_collideConnected_0=function(){return(fi=a._emscripten_bind_b2PrismaticJointDef_get_collideConnected_0=a.asm.bg).apply(null,arguments)},gi=a._emscripten_bind_b2PrismaticJointDef_set_collideConnected_1=function(){return(gi=a._emscripten_bind_b2PrismaticJointDef_set_collideConnected_1=a.asm.cg).apply(null,arguments)},hi=a._emscripten_bind_b2PrismaticJointDef___destroy___0=function(){return(hi=a._emscripten_bind_b2PrismaticJointDef___destroy___0=a.asm.dg).apply(null,
arguments)},ii=a._emscripten_bind_b2World_b2World_1=function(){return(ii=a._emscripten_bind_b2World_b2World_1=a.asm.eg).apply(null,arguments)},ji=a._emscripten_bind_b2World_SetDestructionListener_1=function(){return(ji=a._emscripten_bind_b2World_SetDestructionListener_1=a.asm.fg).apply(null,arguments)},ki=a._emscripten_bind_b2World_SetContactFilter_1=function(){return(ki=a._emscripten_bind_b2World_SetContactFilter_1=a.asm.gg).apply(null,arguments)},li=a._emscripten_bind_b2World_SetContactListener_1=
function(){return(li=a._emscripten_bind_b2World_SetContactListener_1=a.asm.hg).apply(null,arguments)},mi=a._emscripten_bind_b2World_SetDebugDraw_1=function(){return(mi=a._emscripten_bind_b2World_SetDebugDraw_1=a.asm.ig).apply(null,arguments)},ni=a._emscripten_bind_b2World_CreateBody_1=function(){return(ni=a._emscripten_bind_b2World_CreateBody_1=a.asm.jg).apply(null,arguments)},oi=a._emscripten_bind_b2World_DestroyBody_1=function(){return(oi=a._emscripten_bind_b2World_DestroyBody_1=a.asm.kg).apply(null,
arguments)},pi=a._emscripten_bind_b2World_CreateJoint_1=function(){return(pi=a._emscripten_bind_b2World_CreateJoint_1=a.asm.lg).apply(null,arguments)},qi=a._emscripten_bind_b2World_DestroyJoint_1=function(){return(qi=a._emscripten_bind_b2World_DestroyJoint_1=a.asm.mg).apply(null,arguments)},ri=a._emscripten_bind_b2World_Step_3=function(){return(ri=a._emscripten_bind_b2World_Step_3=a.asm.ng).apply(null,arguments)},si=a._emscripten_bind_b2World_ClearForces_0=function(){return(si=a._emscripten_bind_b2World_ClearForces_0=
a.asm.og).apply(null,arguments)},ti=a._emscripten_bind_b2World_DrawDebugData_0=function(){return(ti=a._emscripten_bind_b2World_DrawDebugData_0=a.asm.pg).apply(null,arguments)},ui=a._emscripten_bind_b2World_QueryAABB_2=function(){return(ui=a._emscripten_bind_b2World_QueryAABB_2=a.asm.qg).apply(null,arguments)},vi=a._emscripten_bind_b2World_RayCast_3=function(){return(vi=a._emscripten_bind_b2World_RayCast_3=a.asm.rg).apply(null,arguments)},wi=a._emscripten_bind_b2World_GetBodyList_0=function(){return(wi=
a._emscripten_bind_b2World_GetBodyList_0=a.asm.sg).apply(null,arguments)},xi=a._emscripten_bind_b2World_GetJointList_0=function(){return(xi=a._emscripten_bind_b2World_GetJointList_0=a.asm.tg).apply(null,arguments)},yi=a._emscripten_bind_b2World_GetContactList_0=function(){return(yi=a._emscripten_bind_b2World_GetContactList_0=a.asm.ug).apply(null,arguments)},zi=a._emscripten_bind_b2World_SetAllowSleeping_1=function(){return(zi=a._emscripten_bind_b2World_SetAllowSleeping_1=a.asm.vg).apply(null,arguments)},
Ai=a._emscripten_bind_b2World_GetAllowSleeping_0=function(){return(Ai=a._emscripten_bind_b2World_GetAllowSleeping_0=a.asm.wg).apply(null,arguments)},Bi=a._emscripten_bind_b2World_SetWarmStarting_1=function(){return(Bi=a._emscripten_bind_b2World_SetWarmStarting_1=a.asm.xg).apply(null,arguments)},Ci=a._emscripten_bind_b2World_GetWarmStarting_0=function(){return(Ci=a._emscripten_bind_b2World_GetWarmStarting_0=a.asm.yg).apply(null,arguments)},Di=a._emscripten_bind_b2World_SetContinuousPhysics_1=function(){return(Di=
a._emscripten_bind_b2World_SetContinuousPhysics_1=a.asm.zg).apply(null,arguments)},Ei=a._emscripten_bind_b2World_GetContinuousPhysics_0=function(){return(Ei=a._emscripten_bind_b2World_GetContinuousPhysics_0=a.asm.Ag).apply(null,arguments)},Fi=a._emscripten_bind_b2World_SetSubStepping_1=function(){return(Fi=a._emscripten_bind_b2World_SetSubStepping_1=a.asm.Bg).apply(null,arguments)},Gi=a._emscripten_bind_b2World_GetSubStepping_0=function(){return(Gi=a._emscripten_bind_b2World_GetSubStepping_0=a.asm.Cg).apply(null,
arguments)},Hi=a._emscripten_bind_b2World_GetProxyCount_0=function(){return(Hi=a._emscripten_bind_b2World_GetProxyCount_0=a.asm.Dg).apply(null,arguments)},Ii=a._emscripten_bind_b2World_GetBodyCount_0=function(){return(Ii=a._emscripten_bind_b2World_GetBodyCount_0=a.asm.Eg).apply(null,arguments)},Ji=a._emscripten_bind_b2World_GetJointCount_0=function(){return(Ji=a._emscripten_bind_b2World_GetJointCount_0=a.asm.Fg).apply(null,arguments)},Ki=a._emscripten_bind_b2World_GetContactCount_0=function(){return(Ki=
a._emscripten_bind_b2World_GetContactCount_0=a.asm.Gg).apply(null,arguments)},Li=a._emscripten_bind_b2World_GetTreeHeight_0=function(){return(Li=a._emscripten_bind_b2World_GetTreeHeight_0=a.asm.Hg).apply(null,arguments)},Mi=a._emscripten_bind_b2World_GetTreeBalance_0=function(){return(Mi=a._emscripten_bind_b2World_GetTreeBalance_0=a.asm.Ig).apply(null,arguments)},Ni=a._emscripten_bind_b2World_GetTreeQuality_0=function(){return(Ni=a._emscripten_bind_b2World_GetTreeQuality_0=a.asm.Jg).apply(null,arguments)},
Oi=a._emscripten_bind_b2World_SetGravity_1=function(){return(Oi=a._emscripten_bind_b2World_SetGravity_1=a.asm.Kg).apply(null,arguments)},Pi=a._emscripten_bind_b2World_GetGravity_0=function(){return(Pi=a._emscripten_bind_b2World_GetGravity_0=a.asm.Lg).apply(null,arguments)},Qi=a._emscripten_bind_b2World_IsLocked_0=function(){return(Qi=a._emscripten_bind_b2World_IsLocked_0=a.asm.Mg).apply(null,arguments)},Ri=a._emscripten_bind_b2World_SetAutoClearForces_1=function(){return(Ri=a._emscripten_bind_b2World_SetAutoClearForces_1=
a.asm.Ng).apply(null,arguments)},Si=a._emscripten_bind_b2World_GetAutoClearForces_0=function(){return(Si=a._emscripten_bind_b2World_GetAutoClearForces_0=a.asm.Og).apply(null,arguments)},Ti=a._emscripten_bind_b2World_GetProfile_0=function(){return(Ti=a._emscripten_bind_b2World_GetProfile_0=a.asm.Pg).apply(null,arguments)},Ui=a._emscripten_bind_b2World_Dump_0=function(){return(Ui=a._emscripten_bind_b2World_Dump_0=a.asm.Qg).apply(null,arguments)},Vi=a._emscripten_bind_b2World___destroy___0=function(){return(Vi=
a._emscripten_bind_b2World___destroy___0=a.asm.Rg).apply(null,arguments)},Wi=a._emscripten_bind_b2PrismaticJoint_GetLocalAnchorA_0=function(){return(Wi=a._emscripten_bind_b2PrismaticJoint_GetLocalAnchorA_0=a.asm.Sg).apply(null,arguments)},Xi=a._emscripten_bind_b2PrismaticJoint_GetLocalAnchorB_0=function(){return(Xi=a._emscripten_bind_b2PrismaticJoint_GetLocalAnchorB_0=a.asm.Tg).apply(null,arguments)},Yi=a._emscripten_bind_b2PrismaticJoint_GetLocalAxisA_0=function(){return(Yi=a._emscripten_bind_b2PrismaticJoint_GetLocalAxisA_0=
a.asm.Ug).apply(null,arguments)},Zi=a._emscripten_bind_b2PrismaticJoint_GetReferenceAngle_0=function(){return(Zi=a._emscripten_bind_b2PrismaticJoint_GetReferenceAngle_0=a.asm.Vg).apply(null,arguments)},$i=a._emscripten_bind_b2PrismaticJoint_GetJointTranslation_0=function(){return($i=a._emscripten_bind_b2PrismaticJoint_GetJointTranslation_0=a.asm.Wg).apply(null,arguments)},aj=a._emscripten_bind_b2PrismaticJoint_GetJointSpeed_0=function(){return(aj=a._emscripten_bind_b2PrismaticJoint_GetJointSpeed_0=
a.asm.Xg).apply(null,arguments)},bj=a._emscripten_bind_b2PrismaticJoint_IsLimitEnabled_0=function(){return(bj=a._emscripten_bind_b2PrismaticJoint_IsLimitEnabled_0=a.asm.Yg).apply(null,arguments)},cj=a._emscripten_bind_b2PrismaticJoint_EnableLimit_1=function(){return(cj=a._emscripten_bind_b2PrismaticJoint_EnableLimit_1=a.asm.Zg).apply(null,arguments)},dj=a._emscripten_bind_b2PrismaticJoint_GetLowerLimit_0=function(){return(dj=a._emscripten_bind_b2PrismaticJoint_GetLowerLimit_0=a.asm._g).apply(null,
arguments)},ej=a._emscripten_bind_b2PrismaticJoint_GetUpperLimit_0=function(){return(ej=a._emscripten_bind_b2PrismaticJoint_GetUpperLimit_0=a.asm.$g).apply(null,arguments)},fj=a._emscripten_bind_b2PrismaticJoint_SetLimits_2=function(){return(fj=a._emscripten_bind_b2PrismaticJoint_SetLimits_2=a.asm.ah).apply(null,arguments)},gj=a._emscripten_bind_b2PrismaticJoint_IsMotorEnabled_0=function(){return(gj=a._emscripten_bind_b2PrismaticJoint_IsMotorEnabled_0=a.asm.bh).apply(null,arguments)},hj=a._emscripten_bind_b2PrismaticJoint_EnableMotor_1=
function(){return(hj=a._emscripten_bind_b2PrismaticJoint_EnableMotor_1=a.asm.ch).apply(null,arguments)},ij=a._emscripten_bind_b2PrismaticJoint_SetMotorSpeed_1=function(){return(ij=a._emscripten_bind_b2PrismaticJoint_SetMotorSpeed_1=a.asm.dh).apply(null,arguments)},jj=a._emscripten_bind_b2PrismaticJoint_GetMotorSpeed_0=function(){return(jj=a._emscripten_bind_b2PrismaticJoint_GetMotorSpeed_0=a.asm.eh).apply(null,arguments)},kj=a._emscripten_bind_b2PrismaticJoint_SetMaxMotorForce_1=function(){return(kj=
a._emscripten_bind_b2PrismaticJoint_SetMaxMotorForce_1=a.asm.fh).apply(null,arguments)},lj=a._emscripten_bind_b2PrismaticJoint_GetMaxMotorForce_0=function(){return(lj=a._emscripten_bind_b2PrismaticJoint_GetMaxMotorForce_0=a.asm.gh).apply(null,arguments)},mj=a._emscripten_bind_b2PrismaticJoint_GetMotorForce_1=function(){return(mj=a._emscripten_bind_b2PrismaticJoint_GetMotorForce_1=a.asm.hh).apply(null,arguments)},nj=a._emscripten_bind_b2PrismaticJoint_GetType_0=function(){return(nj=a._emscripten_bind_b2PrismaticJoint_GetType_0=
a.asm.ih).apply(null,arguments)},oj=a._emscripten_bind_b2PrismaticJoint_GetBodyA_0=function(){return(oj=a._emscripten_bind_b2PrismaticJoint_GetBodyA_0=a.asm.jh).apply(null,arguments)},pj=a._emscripten_bind_b2PrismaticJoint_GetBodyB_0=function(){return(pj=a._emscripten_bind_b2PrismaticJoint_GetBodyB_0=a.asm.kh).apply(null,arguments)},qj=a._emscripten_bind_b2PrismaticJoint_GetAnchorA_0=function(){return(qj=a._emscripten_bind_b2PrismaticJoint_GetAnchorA_0=a.asm.lh).apply(null,arguments)},rj=a._emscripten_bind_b2PrismaticJoint_GetAnchorB_0=
function(){return(rj=a._emscripten_bind_b2PrismaticJoint_GetAnchorB_0=a.asm.mh).apply(null,arguments)},sj=a._emscripten_bind_b2PrismaticJoint_GetReactionForce_1=function(){return(sj=a._emscripten_bind_b2PrismaticJoint_GetReactionForce_1=a.asm.nh).apply(null,arguments)},tj=a._emscripten_bind_b2PrismaticJoint_GetReactionTorque_1=function(){return(tj=a._emscripten_bind_b2PrismaticJoint_GetReactionTorque_1=a.asm.oh).apply(null,arguments)},uj=a._emscripten_bind_b2PrismaticJoint_GetNext_0=function(){return(uj=
a._emscripten_bind_b2PrismaticJoint_GetNext_0=a.asm.ph).apply(null,arguments)},vj=a._emscripten_bind_b2PrismaticJoint_GetUserData_0=function(){return(vj=a._emscripten_bind_b2PrismaticJoint_GetUserData_0=a.asm.qh).apply(null,arguments)},wj=a._emscripten_bind_b2PrismaticJoint_SetUserData_1=function(){return(wj=a._emscripten_bind_b2PrismaticJoint_SetUserData_1=a.asm.rh).apply(null,arguments)},xj=a._emscripten_bind_b2PrismaticJoint_IsActive_0=function(){return(xj=a._emscripten_bind_b2PrismaticJoint_IsActive_0=
a.asm.sh).apply(null,arguments)},yj=a._emscripten_bind_b2PrismaticJoint_GetCollideConnected_0=function(){return(yj=a._emscripten_bind_b2PrismaticJoint_GetCollideConnected_0=a.asm.th).apply(null,arguments)},zj=a._emscripten_bind_b2PrismaticJoint___destroy___0=function(){return(zj=a._emscripten_bind_b2PrismaticJoint___destroy___0=a.asm.uh).apply(null,arguments)},Aj=a._emscripten_bind_b2RayCastOutput_get_normal_0=function(){return(Aj=a._emscripten_bind_b2RayCastOutput_get_normal_0=a.asm.vh).apply(null,
arguments)},Bj=a._emscripten_bind_b2RayCastOutput_set_normal_1=function(){return(Bj=a._emscripten_bind_b2RayCastOutput_set_normal_1=a.asm.wh).apply(null,arguments)},Cj=a._emscripten_bind_b2RayCastOutput_get_fraction_0=function(){return(Cj=a._emscripten_bind_b2RayCastOutput_get_fraction_0=a.asm.xh).apply(null,arguments)},Dj=a._emscripten_bind_b2RayCastOutput_set_fraction_1=function(){return(Dj=a._emscripten_bind_b2RayCastOutput_set_fraction_1=a.asm.yh).apply(null,arguments)},Ej=a._emscripten_bind_b2RayCastOutput___destroy___0=
function(){return(Ej=a._emscripten_bind_b2RayCastOutput___destroy___0=a.asm.zh).apply(null,arguments)},Fj=a._emscripten_bind_b2ContactID_get_cf_0=function(){return(Fj=a._emscripten_bind_b2ContactID_get_cf_0=a.asm.Ah).apply(null,arguments)},Gj=a._emscripten_bind_b2ContactID_set_cf_1=function(){return(Gj=a._emscripten_bind_b2ContactID_set_cf_1=a.asm.Bh).apply(null,arguments)},Hj=a._emscripten_bind_b2ContactID_get_key_0=function(){return(Hj=a._emscripten_bind_b2ContactID_get_key_0=a.asm.Ch).apply(null,
arguments)},Ij=a._emscripten_bind_b2ContactID_set_key_1=function(){return(Ij=a._emscripten_bind_b2ContactID_set_key_1=a.asm.Dh).apply(null,arguments)},Jj=a._emscripten_bind_b2ContactID___destroy___0=function(){return(Jj=a._emscripten_bind_b2ContactID___destroy___0=a.asm.Eh).apply(null,arguments)},Kj=a._emscripten_bind_JSContactListener_JSContactListener_0=function(){return(Kj=a._emscripten_bind_JSContactListener_JSContactListener_0=a.asm.Fh).apply(null,arguments)},Lj=a._emscripten_bind_JSContactListener_BeginContact_1=
function(){return(Lj=a._emscripten_bind_JSContactListener_BeginContact_1=a.asm.Gh).apply(null,arguments)},Mj=a._emscripten_bind_JSContactListener_EndContact_1=function(){return(Mj=a._emscripten_bind_JSContactListener_EndContact_1=a.asm.Hh).apply(null,arguments)},Nj=a._emscripten_bind_JSContactListener_PreSolve_2=function(){return(Nj=a._emscripten_bind_JSContactListener_PreSolve_2=a.asm.Ih).apply(null,arguments)},Oj=a._emscripten_bind_JSContactListener_PostSolve_2=function(){return(Oj=a._emscripten_bind_JSContactListener_PostSolve_2=
a.asm.Jh).apply(null,arguments)},Pj=a._emscripten_bind_JSContactListener___destroy___0=function(){return(Pj=a._emscripten_bind_JSContactListener___destroy___0=a.asm.Kh).apply(null,arguments)},Qj=a._emscripten_bind_b2Mat22_b2Mat22_0=function(){return(Qj=a._emscripten_bind_b2Mat22_b2Mat22_0=a.asm.Lh).apply(null,arguments)},Rj=a._emscripten_bind_b2Mat22_b2Mat22_2=function(){return(Rj=a._emscripten_bind_b2Mat22_b2Mat22_2=a.asm.Mh).apply(null,arguments)},Sj=a._emscripten_bind_b2Mat22_b2Mat22_4=function(){return(Sj=
a._emscripten_bind_b2Mat22_b2Mat22_4=a.asm.Nh).apply(null,arguments)},Tj=a._emscripten_bind_b2Mat22_Set_2=function(){return(Tj=a._emscripten_bind_b2Mat22_Set_2=a.asm.Oh).apply(null,arguments)},Uj=a._emscripten_bind_b2Mat22_SetIdentity_0=function(){return(Uj=a._emscripten_bind_b2Mat22_SetIdentity_0=a.asm.Ph).apply(null,arguments)},Vj=a._emscripten_bind_b2Mat22_SetZero_0=function(){return(Vj=a._emscripten_bind_b2Mat22_SetZero_0=a.asm.Qh).apply(null,arguments)},Wj=a._emscripten_bind_b2Mat22_GetInverse_0=
function(){return(Wj=a._emscripten_bind_b2Mat22_GetInverse_0=a.asm.Rh).apply(null,arguments)},Xj=a._emscripten_bind_b2Mat22_Solve_1=function(){return(Xj=a._emscripten_bind_b2Mat22_Solve_1=a.asm.Sh).apply(null,arguments)},Yj=a._emscripten_bind_b2Mat22_get_ex_0=function(){return(Yj=a._emscripten_bind_b2Mat22_get_ex_0=a.asm.Th).apply(null,arguments)},Zj=a._emscripten_bind_b2Mat22_set_ex_1=function(){return(Zj=a._emscripten_bind_b2Mat22_set_ex_1=a.asm.Uh).apply(null,arguments)},ak=a._emscripten_bind_b2Mat22_get_ey_0=
function(){return(ak=a._emscripten_bind_b2Mat22_get_ey_0=a.asm.Vh).apply(null,arguments)},bk=a._emscripten_bind_b2Mat22_set_ey_1=function(){return(bk=a._emscripten_bind_b2Mat22_set_ey_1=a.asm.Wh).apply(null,arguments)},ck=a._emscripten_bind_b2Mat22___destroy___0=function(){return(ck=a._emscripten_bind_b2Mat22___destroy___0=a.asm.Xh).apply(null,arguments)},dk=a._emscripten_bind_b2WheelJointDef_b2WheelJointDef_0=function(){return(dk=a._emscripten_bind_b2WheelJointDef_b2WheelJointDef_0=a.asm.Yh).apply(null,
arguments)},ek=a._emscripten_bind_b2WheelJointDef_Initialize_4=function(){return(ek=a._emscripten_bind_b2WheelJointDef_Initialize_4=a.asm.Zh).apply(null,arguments)},fk=a._emscripten_bind_b2WheelJointDef_get_localAnchorA_0=function(){return(fk=a._emscripten_bind_b2WheelJointDef_get_localAnchorA_0=a.asm._h).apply(null,arguments)},gk=a._emscripten_bind_b2WheelJointDef_set_localAnchorA_1=function(){return(gk=a._emscripten_bind_b2WheelJointDef_set_localAnchorA_1=a.asm.$h).apply(null,arguments)},hk=a._emscripten_bind_b2WheelJointDef_get_localAnchorB_0=
function(){return(hk=a._emscripten_bind_b2WheelJointDef_get_localAnchorB_0=a.asm.ai).apply(null,arguments)},ik=a._emscripten_bind_b2WheelJointDef_set_localAnchorB_1=function(){return(ik=a._emscripten_bind_b2WheelJointDef_set_localAnchorB_1=a.asm.bi).apply(null,arguments)},jk=a._emscripten_bind_b2WheelJointDef_get_localAxisA_0=function(){return(jk=a._emscripten_bind_b2WheelJointDef_get_localAxisA_0=a.asm.ci).apply(null,arguments)},kk=a._emscripten_bind_b2WheelJointDef_set_localAxisA_1=function(){return(kk=
a._emscripten_bind_b2WheelJointDef_set_localAxisA_1=a.asm.di).apply(null,arguments)},lk=a._emscripten_bind_b2WheelJointDef_get_enableMotor_0=function(){return(lk=a._emscripten_bind_b2WheelJointDef_get_enableMotor_0=a.asm.ei).apply(null,arguments)},mk=a._emscripten_bind_b2WheelJointDef_set_enableMotor_1=function(){return(mk=a._emscripten_bind_b2WheelJointDef_set_enableMotor_1=a.asm.fi).apply(null,arguments)},nk=a._emscripten_bind_b2WheelJointDef_get_maxMotorTorque_0=function(){return(nk=a._emscripten_bind_b2WheelJointDef_get_maxMotorTorque_0=
a.asm.gi).apply(null,arguments)},ok=a._emscripten_bind_b2WheelJointDef_set_maxMotorTorque_1=function(){return(ok=a._emscripten_bind_b2WheelJointDef_set_maxMotorTorque_1=a.asm.hi).apply(null,arguments)},pk=a._emscripten_bind_b2WheelJointDef_get_motorSpeed_0=function(){return(pk=a._emscripten_bind_b2WheelJointDef_get_motorSpeed_0=a.asm.ii).apply(null,arguments)},qk=a._emscripten_bind_b2WheelJointDef_set_motorSpeed_1=function(){return(qk=a._emscripten_bind_b2WheelJointDef_set_motorSpeed_1=a.asm.ji).apply(null,
arguments)},rk=a._emscripten_bind_b2WheelJointDef_get_frequencyHz_0=function(){return(rk=a._emscripten_bind_b2WheelJointDef_get_frequencyHz_0=a.asm.ki).apply(null,arguments)},sk=a._emscripten_bind_b2WheelJointDef_set_frequencyHz_1=function(){return(sk=a._emscripten_bind_b2WheelJointDef_set_frequencyHz_1=a.asm.li).apply(null,arguments)},tk=a._emscripten_bind_b2WheelJointDef_get_dampingRatio_0=function(){return(tk=a._emscripten_bind_b2WheelJointDef_get_dampingRatio_0=a.asm.mi).apply(null,arguments)},
uk=a._emscripten_bind_b2WheelJointDef_set_dampingRatio_1=function(){return(uk=a._emscripten_bind_b2WheelJointDef_set_dampingRatio_1=a.asm.ni).apply(null,arguments)},vk=a._emscripten_bind_b2WheelJointDef_get_type_0=function(){return(vk=a._emscripten_bind_b2WheelJointDef_get_type_0=a.asm.oi).apply(null,arguments)},wk=a._emscripten_bind_b2WheelJointDef_set_type_1=function(){return(wk=a._emscripten_bind_b2WheelJointDef_set_type_1=a.asm.pi).apply(null,arguments)},xk=a._emscripten_bind_b2WheelJointDef_get_userData_0=
function(){return(xk=a._emscripten_bind_b2WheelJointDef_get_userData_0=a.asm.qi).apply(null,arguments)},yk=a._emscripten_bind_b2WheelJointDef_set_userData_1=function(){return(yk=a._emscripten_bind_b2WheelJointDef_set_userData_1=a.asm.ri).apply(null,arguments)},zk=a._emscripten_bind_b2WheelJointDef_get_bodyA_0=function(){return(zk=a._emscripten_bind_b2WheelJointDef_get_bodyA_0=a.asm.si).apply(null,arguments)},Ak=a._emscripten_bind_b2WheelJointDef_set_bodyA_1=function(){return(Ak=a._emscripten_bind_b2WheelJointDef_set_bodyA_1=
a.asm.ti).apply(null,arguments)},Bk=a._emscripten_bind_b2WheelJointDef_get_bodyB_0=function(){return(Bk=a._emscripten_bind_b2WheelJointDef_get_bodyB_0=a.asm.ui).apply(null,arguments)},Ck=a._emscripten_bind_b2WheelJointDef_set_bodyB_1=function(){return(Ck=a._emscripten_bind_b2WheelJointDef_set_bodyB_1=a.asm.vi).apply(null,arguments)},Dk=a._emscripten_bind_b2WheelJointDef_get_collideConnected_0=function(){return(Dk=a._emscripten_bind_b2WheelJointDef_get_collideConnected_0=a.asm.wi).apply(null,arguments)},
Ek=a._emscripten_bind_b2WheelJointDef_set_collideConnected_1=function(){return(Ek=a._emscripten_bind_b2WheelJointDef_set_collideConnected_1=a.asm.xi).apply(null,arguments)},Fk=a._emscripten_bind_b2WheelJointDef___destroy___0=function(){return(Fk=a._emscripten_bind_b2WheelJointDef___destroy___0=a.asm.yi).apply(null,arguments)},Gk=a._emscripten_bind_b2CircleShape_b2CircleShape_0=function(){return(Gk=a._emscripten_bind_b2CircleShape_b2CircleShape_0=a.asm.zi).apply(null,arguments)},Hk=a._emscripten_bind_b2CircleShape_GetType_0=
function(){return(Hk=a._emscripten_bind_b2CircleShape_GetType_0=a.asm.Ai).apply(null,arguments)},Ik=a._emscripten_bind_b2CircleShape_GetChildCount_0=function(){return(Ik=a._emscripten_bind_b2CircleShape_GetChildCount_0=a.asm.Bi).apply(null,arguments)},Jk=a._emscripten_bind_b2CircleShape_TestPoint_2=function(){return(Jk=a._emscripten_bind_b2CircleShape_TestPoint_2=a.asm.Ci).apply(null,arguments)},Kk=a._emscripten_bind_b2CircleShape_RayCast_4=function(){return(Kk=a._emscripten_bind_b2CircleShape_RayCast_4=
a.asm.Di).apply(null,arguments)},Lk=a._emscripten_bind_b2CircleShape_ComputeAABB_3=function(){return(Lk=a._emscripten_bind_b2CircleShape_ComputeAABB_3=a.asm.Ei).apply(null,arguments)},Mk=a._emscripten_bind_b2CircleShape_ComputeMass_2=function(){return(Mk=a._emscripten_bind_b2CircleShape_ComputeMass_2=a.asm.Fi).apply(null,arguments)},Nk=a._emscripten_bind_b2CircleShape_get_m_p_0=function(){return(Nk=a._emscripten_bind_b2CircleShape_get_m_p_0=a.asm.Gi).apply(null,arguments)},Ok=a._emscripten_bind_b2CircleShape_set_m_p_1=
function(){return(Ok=a._emscripten_bind_b2CircleShape_set_m_p_1=a.asm.Hi).apply(null,arguments)},Pk=a._emscripten_bind_b2CircleShape_get_m_type_0=function(){return(Pk=a._emscripten_bind_b2CircleShape_get_m_type_0=a.asm.Ii).apply(null,arguments)},Qk=a._emscripten_bind_b2CircleShape_set_m_type_1=function(){return(Qk=a._emscripten_bind_b2CircleShape_set_m_type_1=a.asm.Ji).apply(null,arguments)},Rk=a._emscripten_bind_b2CircleShape_get_m_radius_0=function(){return(Rk=a._emscripten_bind_b2CircleShape_get_m_radius_0=
a.asm.Ki).apply(null,arguments)},Sk=a._emscripten_bind_b2CircleShape_set_m_radius_1=function(){return(Sk=a._emscripten_bind_b2CircleShape_set_m_radius_1=a.asm.Li).apply(null,arguments)},Tk=a._emscripten_bind_b2CircleShape___destroy___0=function(){return(Tk=a._emscripten_bind_b2CircleShape___destroy___0=a.asm.Mi).apply(null,arguments)},Uk=a._emscripten_bind_b2WeldJointDef_b2WeldJointDef_0=function(){return(Uk=a._emscripten_bind_b2WeldJointDef_b2WeldJointDef_0=a.asm.Ni).apply(null,arguments)},Vk=a._emscripten_bind_b2WeldJointDef_Initialize_3=
function(){return(Vk=a._emscripten_bind_b2WeldJointDef_Initialize_3=a.asm.Oi).apply(null,arguments)},Wk=a._emscripten_bind_b2WeldJointDef_get_localAnchorA_0=function(){return(Wk=a._emscripten_bind_b2WeldJointDef_get_localAnchorA_0=a.asm.Pi).apply(null,arguments)},Xk=a._emscripten_bind_b2WeldJointDef_set_localAnchorA_1=function(){return(Xk=a._emscripten_bind_b2WeldJointDef_set_localAnchorA_1=a.asm.Qi).apply(null,arguments)},Yk=a._emscripten_bind_b2WeldJointDef_get_localAnchorB_0=function(){return(Yk=
a._emscripten_bind_b2WeldJointDef_get_localAnchorB_0=a.asm.Ri).apply(null,arguments)},Zk=a._emscripten_bind_b2WeldJointDef_set_localAnchorB_1=function(){return(Zk=a._emscripten_bind_b2WeldJointDef_set_localAnchorB_1=a.asm.Si).apply(null,arguments)},$k=a._emscripten_bind_b2WeldJointDef_get_referenceAngle_0=function(){return($k=a._emscripten_bind_b2WeldJointDef_get_referenceAngle_0=a.asm.Ti).apply(null,arguments)},al=a._emscripten_bind_b2WeldJointDef_set_referenceAngle_1=function(){return(al=a._emscripten_bind_b2WeldJointDef_set_referenceAngle_1=
a.asm.Ui).apply(null,arguments)},bl=a._emscripten_bind_b2WeldJointDef_get_frequencyHz_0=function(){return(bl=a._emscripten_bind_b2WeldJointDef_get_frequencyHz_0=a.asm.Vi).apply(null,arguments)},cl=a._emscripten_bind_b2WeldJointDef_set_frequencyHz_1=function(){return(cl=a._emscripten_bind_b2WeldJointDef_set_frequencyHz_1=a.asm.Wi).apply(null,arguments)},dl=a._emscripten_bind_b2WeldJointDef_get_dampingRatio_0=function(){return(dl=a._emscripten_bind_b2WeldJointDef_get_dampingRatio_0=a.asm.Xi).apply(null,
arguments)},el=a._emscripten_bind_b2WeldJointDef_set_dampingRatio_1=function(){return(el=a._emscripten_bind_b2WeldJointDef_set_dampingRatio_1=a.asm.Yi).apply(null,arguments)},fl=a._emscripten_bind_b2WeldJointDef_get_type_0=function(){return(fl=a._emscripten_bind_b2WeldJointDef_get_type_0=a.asm.Zi).apply(null,arguments)},gl=a._emscripten_bind_b2WeldJointDef_set_type_1=function(){return(gl=a._emscripten_bind_b2WeldJointDef_set_type_1=a.asm._i).apply(null,arguments)},hl=a._emscripten_bind_b2WeldJointDef_get_userData_0=
function(){return(hl=a._emscripten_bind_b2WeldJointDef_get_userData_0=a.asm.$i).apply(null,arguments)},il=a._emscripten_bind_b2WeldJointDef_set_userData_1=function(){return(il=a._emscripten_bind_b2WeldJointDef_set_userData_1=a.asm.aj).apply(null,arguments)},jl=a._emscripten_bind_b2WeldJointDef_get_bodyA_0=function(){return(jl=a._emscripten_bind_b2WeldJointDef_get_bodyA_0=a.asm.bj).apply(null,arguments)},kl=a._emscripten_bind_b2WeldJointDef_set_bodyA_1=function(){return(kl=a._emscripten_bind_b2WeldJointDef_set_bodyA_1=
a.asm.cj).apply(null,arguments)},ll=a._emscripten_bind_b2WeldJointDef_get_bodyB_0=function(){return(ll=a._emscripten_bind_b2WeldJointDef_get_bodyB_0=a.asm.dj).apply(null,arguments)},ml=a._emscripten_bind_b2WeldJointDef_set_bodyB_1=function(){return(ml=a._emscripten_bind_b2WeldJointDef_set_bodyB_1=a.asm.ej).apply(null,arguments)},nl=a._emscripten_bind_b2WeldJointDef_get_collideConnected_0=function(){return(nl=a._emscripten_bind_b2WeldJointDef_get_collideConnected_0=a.asm.fj).apply(null,arguments)},
ol=a._emscripten_bind_b2WeldJointDef_set_collideConnected_1=function(){return(ol=a._emscripten_bind_b2WeldJointDef_set_collideConnected_1=a.asm.gj).apply(null,arguments)},pl=a._emscripten_bind_b2WeldJointDef___destroy___0=function(){return(pl=a._emscripten_bind_b2WeldJointDef___destroy___0=a.asm.hj).apply(null,arguments)},ql=a._emscripten_bind_b2MassData_b2MassData_0=function(){return(ql=a._emscripten_bind_b2MassData_b2MassData_0=a.asm.ij).apply(null,arguments)},rl=a._emscripten_bind_b2MassData_get_mass_0=
function(){return(rl=a._emscripten_bind_b2MassData_get_mass_0=a.asm.jj).apply(null,arguments)},sl=a._emscripten_bind_b2MassData_set_mass_1=function(){return(sl=a._emscripten_bind_b2MassData_set_mass_1=a.asm.kj).apply(null,arguments)},tl=a._emscripten_bind_b2MassData_get_center_0=function(){return(tl=a._emscripten_bind_b2MassData_get_center_0=a.asm.lj).apply(null,arguments)},ul=a._emscripten_bind_b2MassData_set_center_1=function(){return(ul=a._emscripten_bind_b2MassData_set_center_1=a.asm.mj).apply(null,
arguments)},vl=a._emscripten_bind_b2MassData_get_I_0=function(){return(vl=a._emscripten_bind_b2MassData_get_I_0=a.asm.nj).apply(null,arguments)},wl=a._emscripten_bind_b2MassData_set_I_1=function(){return(wl=a._emscripten_bind_b2MassData_set_I_1=a.asm.oj).apply(null,arguments)},xl=a._emscripten_bind_b2MassData___destroy___0=function(){return(xl=a._emscripten_bind_b2MassData___destroy___0=a.asm.pj).apply(null,arguments)},yl=a._emscripten_bind_b2GearJoint_GetJoint1_0=function(){return(yl=a._emscripten_bind_b2GearJoint_GetJoint1_0=
a.asm.qj).apply(null,arguments)},zl=a._emscripten_bind_b2GearJoint_GetJoint2_0=function(){return(zl=a._emscripten_bind_b2GearJoint_GetJoint2_0=a.asm.rj).apply(null,arguments)},Al=a._emscripten_bind_b2GearJoint_SetRatio_1=function(){return(Al=a._emscripten_bind_b2GearJoint_SetRatio_1=a.asm.sj).apply(null,arguments)},Bl=a._emscripten_bind_b2GearJoint_GetRatio_0=function(){return(Bl=a._emscripten_bind_b2GearJoint_GetRatio_0=a.asm.tj).apply(null,arguments)},Cl=a._emscripten_bind_b2GearJoint_GetType_0=
function(){return(Cl=a._emscripten_bind_b2GearJoint_GetType_0=a.asm.uj).apply(null,arguments)},Dl=a._emscripten_bind_b2GearJoint_GetBodyA_0=function(){return(Dl=a._emscripten_bind_b2GearJoint_GetBodyA_0=a.asm.vj).apply(null,arguments)},El=a._emscripten_bind_b2GearJoint_GetBodyB_0=function(){return(El=a._emscripten_bind_b2GearJoint_GetBodyB_0=a.asm.wj).apply(null,arguments)},Fl=a._emscripten_bind_b2GearJoint_GetAnchorA_0=function(){return(Fl=a._emscripten_bind_b2GearJoint_GetAnchorA_0=a.asm.xj).apply(null,
arguments)},Gl=a._emscripten_bind_b2GearJoint_GetAnchorB_0=function(){return(Gl=a._emscripten_bind_b2GearJoint_GetAnchorB_0=a.asm.yj).apply(null,arguments)},Hl=a._emscripten_bind_b2GearJoint_GetReactionForce_1=function(){return(Hl=a._emscripten_bind_b2GearJoint_GetReactionForce_1=a.asm.zj).apply(null,arguments)},Il=a._emscripten_bind_b2GearJoint_GetReactionTorque_1=function(){return(Il=a._emscripten_bind_b2GearJoint_GetReactionTorque_1=a.asm.Aj).apply(null,arguments)},Jl=a._emscripten_bind_b2GearJoint_GetNext_0=
function(){return(Jl=a._emscripten_bind_b2GearJoint_GetNext_0=a.asm.Bj).apply(null,arguments)},Kl=a._emscripten_bind_b2GearJoint_GetUserData_0=function(){return(Kl=a._emscripten_bind_b2GearJoint_GetUserData_0=a.asm.Cj).apply(null,arguments)},Ll=a._emscripten_bind_b2GearJoint_SetUserData_1=function(){return(Ll=a._emscripten_bind_b2GearJoint_SetUserData_1=a.asm.Dj).apply(null,arguments)},Ml=a._emscripten_bind_b2GearJoint_IsActive_0=function(){return(Ml=a._emscripten_bind_b2GearJoint_IsActive_0=a.asm.Ej).apply(null,
arguments)},Nl=a._emscripten_bind_b2GearJoint_GetCollideConnected_0=function(){return(Nl=a._emscripten_bind_b2GearJoint_GetCollideConnected_0=a.asm.Fj).apply(null,arguments)},Ol=a._emscripten_bind_b2GearJoint___destroy___0=function(){return(Ol=a._emscripten_bind_b2GearJoint___destroy___0=a.asm.Gj).apply(null,arguments)},Pl=a._emscripten_bind_b2WeldJoint_GetLocalAnchorA_0=function(){return(Pl=a._emscripten_bind_b2WeldJoint_GetLocalAnchorA_0=a.asm.Hj).apply(null,arguments)},Ql=a._emscripten_bind_b2WeldJoint_GetLocalAnchorB_0=
function(){return(Ql=a._emscripten_bind_b2WeldJoint_GetLocalAnchorB_0=a.asm.Ij).apply(null,arguments)},Rl=a._emscripten_bind_b2WeldJoint_SetFrequency_1=function(){return(Rl=a._emscripten_bind_b2WeldJoint_SetFrequency_1=a.asm.Jj).apply(null,arguments)},Sl=a._emscripten_bind_b2WeldJoint_GetFrequency_0=function(){return(Sl=a._emscripten_bind_b2WeldJoint_GetFrequency_0=a.asm.Kj).apply(null,arguments)},Tl=a._emscripten_bind_b2WeldJoint_SetDampingRatio_1=function(){return(Tl=a._emscripten_bind_b2WeldJoint_SetDampingRatio_1=
a.asm.Lj).apply(null,arguments)},Ul=a._emscripten_bind_b2WeldJoint_GetDampingRatio_0=function(){return(Ul=a._emscripten_bind_b2WeldJoint_GetDampingRatio_0=a.asm.Mj).apply(null,arguments)},Vl=a._emscripten_bind_b2WeldJoint_Dump_0=function(){return(Vl=a._emscripten_bind_b2WeldJoint_Dump_0=a.asm.Nj).apply(null,arguments)},Wl=a._emscripten_bind_b2WeldJoint_GetType_0=function(){return(Wl=a._emscripten_bind_b2WeldJoint_GetType_0=a.asm.Oj).apply(null,arguments)},Xl=a._emscripten_bind_b2WeldJoint_GetBodyA_0=
function(){return(Xl=a._emscripten_bind_b2WeldJoint_GetBodyA_0=a.asm.Pj).apply(null,arguments)},Yl=a._emscripten_bind_b2WeldJoint_GetBodyB_0=function(){return(Yl=a._emscripten_bind_b2WeldJoint_GetBodyB_0=a.asm.Qj).apply(null,arguments)},Zl=a._emscripten_bind_b2WeldJoint_GetAnchorA_0=function(){return(Zl=a._emscripten_bind_b2WeldJoint_GetAnchorA_0=a.asm.Rj).apply(null,arguments)},$l=a._emscripten_bind_b2WeldJoint_GetAnchorB_0=function(){return($l=a._emscripten_bind_b2WeldJoint_GetAnchorB_0=a.asm.Sj).apply(null,
arguments)},am=a._emscripten_bind_b2WeldJoint_GetReactionForce_1=function(){return(am=a._emscripten_bind_b2WeldJoint_GetReactionForce_1=a.asm.Tj).apply(null,arguments)},bm=a._emscripten_bind_b2WeldJoint_GetReactionTorque_1=function(){return(bm=a._emscripten_bind_b2WeldJoint_GetReactionTorque_1=a.asm.Uj).apply(null,arguments)},cm=a._emscripten_bind_b2WeldJoint_GetNext_0=function(){return(cm=a._emscripten_bind_b2WeldJoint_GetNext_0=a.asm.Vj).apply(null,arguments)},dm=a._emscripten_bind_b2WeldJoint_GetUserData_0=
function(){return(dm=a._emscripten_bind_b2WeldJoint_GetUserData_0=a.asm.Wj).apply(null,arguments)},em=a._emscripten_bind_b2WeldJoint_SetUserData_1=function(){return(em=a._emscripten_bind_b2WeldJoint_SetUserData_1=a.asm.Xj).apply(null,arguments)},fm=a._emscripten_bind_b2WeldJoint_IsActive_0=function(){return(fm=a._emscripten_bind_b2WeldJoint_IsActive_0=a.asm.Yj).apply(null,arguments)},gm=a._emscripten_bind_b2WeldJoint_GetCollideConnected_0=function(){return(gm=a._emscripten_bind_b2WeldJoint_GetCollideConnected_0=
a.asm.Zj).apply(null,arguments)},hm=a._emscripten_bind_b2WeldJoint___destroy___0=function(){return(hm=a._emscripten_bind_b2WeldJoint___destroy___0=a.asm._j).apply(null,arguments)},im=a._emscripten_bind_b2JointEdge_b2JointEdge_0=function(){return(im=a._emscripten_bind_b2JointEdge_b2JointEdge_0=a.asm.$j).apply(null,arguments)},jm=a._emscripten_bind_b2JointEdge_get_other_0=function(){return(jm=a._emscripten_bind_b2JointEdge_get_other_0=a.asm.ak).apply(null,arguments)},km=a._emscripten_bind_b2JointEdge_set_other_1=
function(){return(km=a._emscripten_bind_b2JointEdge_set_other_1=a.asm.bk).apply(null,arguments)},lm=a._emscripten_bind_b2JointEdge_get_joint_0=function(){return(lm=a._emscripten_bind_b2JointEdge_get_joint_0=a.asm.ck).apply(null,arguments)},mm=a._emscripten_bind_b2JointEdge_set_joint_1=function(){return(mm=a._emscripten_bind_b2JointEdge_set_joint_1=a.asm.dk).apply(null,arguments)},nm=a._emscripten_bind_b2JointEdge_get_prev_0=function(){return(nm=a._emscripten_bind_b2JointEdge_get_prev_0=a.asm.ek).apply(null,
arguments)},om=a._emscripten_bind_b2JointEdge_set_prev_1=function(){return(om=a._emscripten_bind_b2JointEdge_set_prev_1=a.asm.fk).apply(null,arguments)},pm=a._emscripten_bind_b2JointEdge_get_next_0=function(){return(pm=a._emscripten_bind_b2JointEdge_get_next_0=a.asm.gk).apply(null,arguments)},qm=a._emscripten_bind_b2JointEdge_set_next_1=function(){return(qm=a._emscripten_bind_b2JointEdge_set_next_1=a.asm.hk).apply(null,arguments)},rm=a._emscripten_bind_b2JointEdge___destroy___0=function(){return(rm=
a._emscripten_bind_b2JointEdge___destroy___0=a.asm.ik).apply(null,arguments)},sm=a._emscripten_bind_b2PulleyJointDef_b2PulleyJointDef_0=function(){return(sm=a._emscripten_bind_b2PulleyJointDef_b2PulleyJointDef_0=a.asm.jk).apply(null,arguments)},tm=a._emscripten_bind_b2PulleyJointDef_Initialize_7=function(){return(tm=a._emscripten_bind_b2PulleyJointDef_Initialize_7=a.asm.kk).apply(null,arguments)},um=a._emscripten_bind_b2PulleyJointDef_get_groundAnchorA_0=function(){return(um=a._emscripten_bind_b2PulleyJointDef_get_groundAnchorA_0=
a.asm.lk).apply(null,arguments)},wm=a._emscripten_bind_b2PulleyJointDef_set_groundAnchorA_1=function(){return(wm=a._emscripten_bind_b2PulleyJointDef_set_groundAnchorA_1=a.asm.mk).apply(null,arguments)},xm=a._emscripten_bind_b2PulleyJointDef_get_groundAnchorB_0=function(){return(xm=a._emscripten_bind_b2PulleyJointDef_get_groundAnchorB_0=a.asm.nk).apply(null,arguments)},ym=a._emscripten_bind_b2PulleyJointDef_set_groundAnchorB_1=function(){return(ym=a._emscripten_bind_b2PulleyJointDef_set_groundAnchorB_1=
a.asm.ok).apply(null,arguments)},zm=a._emscripten_bind_b2PulleyJointDef_get_localAnchorA_0=function(){return(zm=a._emscripten_bind_b2PulleyJointDef_get_localAnchorA_0=a.asm.pk).apply(null,arguments)},Am=a._emscripten_bind_b2PulleyJointDef_set_localAnchorA_1=function(){return(Am=a._emscripten_bind_b2PulleyJointDef_set_localAnchorA_1=a.asm.qk).apply(null,arguments)},Bm=a._emscripten_bind_b2PulleyJointDef_get_localAnchorB_0=function(){return(Bm=a._emscripten_bind_b2PulleyJointDef_get_localAnchorB_0=
a.asm.rk).apply(null,arguments)},Cm=a._emscripten_bind_b2PulleyJointDef_set_localAnchorB_1=function(){return(Cm=a._emscripten_bind_b2PulleyJointDef_set_localAnchorB_1=a.asm.sk).apply(null,arguments)},Dm=a._emscripten_bind_b2PulleyJointDef_get_lengthA_0=function(){return(Dm=a._emscripten_bind_b2PulleyJointDef_get_lengthA_0=a.asm.tk).apply(null,arguments)},Em=a._emscripten_bind_b2PulleyJointDef_set_lengthA_1=function(){return(Em=a._emscripten_bind_b2PulleyJointDef_set_lengthA_1=a.asm.uk).apply(null,
arguments)},Fm=a._emscripten_bind_b2PulleyJointDef_get_lengthB_0=function(){return(Fm=a._emscripten_bind_b2PulleyJointDef_get_lengthB_0=a.asm.vk).apply(null,arguments)},Gm=a._emscripten_bind_b2PulleyJointDef_set_lengthB_1=function(){return(Gm=a._emscripten_bind_b2PulleyJointDef_set_lengthB_1=a.asm.wk).apply(null,arguments)},Hm=a._emscripten_bind_b2PulleyJointDef_get_ratio_0=function(){return(Hm=a._emscripten_bind_b2PulleyJointDef_get_ratio_0=a.asm.xk).apply(null,arguments)},Im=a._emscripten_bind_b2PulleyJointDef_set_ratio_1=
function(){return(Im=a._emscripten_bind_b2PulleyJointDef_set_ratio_1=a.asm.yk).apply(null,arguments)},Jm=a._emscripten_bind_b2PulleyJointDef_get_type_0=function(){return(Jm=a._emscripten_bind_b2PulleyJointDef_get_type_0=a.asm.zk).apply(null,arguments)},Km=a._emscripten_bind_b2PulleyJointDef_set_type_1=function(){return(Km=a._emscripten_bind_b2PulleyJointDef_set_type_1=a.asm.Ak).apply(null,arguments)},Lm=a._emscripten_bind_b2PulleyJointDef_get_userData_0=function(){return(Lm=a._emscripten_bind_b2PulleyJointDef_get_userData_0=
a.asm.Bk).apply(null,arguments)},Mm=a._emscripten_bind_b2PulleyJointDef_set_userData_1=function(){return(Mm=a._emscripten_bind_b2PulleyJointDef_set_userData_1=a.asm.Ck).apply(null,arguments)},Nm=a._emscripten_bind_b2PulleyJointDef_get_bodyA_0=function(){return(Nm=a._emscripten_bind_b2PulleyJointDef_get_bodyA_0=a.asm.Dk).apply(null,arguments)},Om=a._emscripten_bind_b2PulleyJointDef_set_bodyA_1=function(){return(Om=a._emscripten_bind_b2PulleyJointDef_set_bodyA_1=a.asm.Ek).apply(null,arguments)},Pm=
a._emscripten_bind_b2PulleyJointDef_get_bodyB_0=function(){return(Pm=a._emscripten_bind_b2PulleyJointDef_get_bodyB_0=a.asm.Fk).apply(null,arguments)},Qm=a._emscripten_bind_b2PulleyJointDef_set_bodyB_1=function(){return(Qm=a._emscripten_bind_b2PulleyJointDef_set_bodyB_1=a.asm.Gk).apply(null,arguments)},Rm=a._emscripten_bind_b2PulleyJointDef_get_collideConnected_0=function(){return(Rm=a._emscripten_bind_b2PulleyJointDef_get_collideConnected_0=a.asm.Hk).apply(null,arguments)},Sm=a._emscripten_bind_b2PulleyJointDef_set_collideConnected_1=
function(){return(Sm=a._emscripten_bind_b2PulleyJointDef_set_collideConnected_1=a.asm.Ik).apply(null,arguments)},Tm=a._emscripten_bind_b2PulleyJointDef___destroy___0=function(){return(Tm=a._emscripten_bind_b2PulleyJointDef___destroy___0=a.asm.Jk).apply(null,arguments)},Um=a._emscripten_bind_b2ManifoldPoint_b2ManifoldPoint_0=function(){return(Um=a._emscripten_bind_b2ManifoldPoint_b2ManifoldPoint_0=a.asm.Kk).apply(null,arguments)},Vm=a._emscripten_bind_b2ManifoldPoint_get_localPoint_0=function(){return(Vm=
a._emscripten_bind_b2ManifoldPoint_get_localPoint_0=a.asm.Lk).apply(null,arguments)},Wm=a._emscripten_bind_b2ManifoldPoint_set_localPoint_1=function(){return(Wm=a._emscripten_bind_b2ManifoldPoint_set_localPoint_1=a.asm.Mk).apply(null,arguments)},Xm=a._emscripten_bind_b2ManifoldPoint_get_normalImpulse_0=function(){return(Xm=a._emscripten_bind_b2ManifoldPoint_get_normalImpulse_0=a.asm.Nk).apply(null,arguments)},Ym=a._emscripten_bind_b2ManifoldPoint_set_normalImpulse_1=function(){return(Ym=a._emscripten_bind_b2ManifoldPoint_set_normalImpulse_1=
a.asm.Ok).apply(null,arguments)},Zm=a._emscripten_bind_b2ManifoldPoint_get_tangentImpulse_0=function(){return(Zm=a._emscripten_bind_b2ManifoldPoint_get_tangentImpulse_0=a.asm.Pk).apply(null,arguments)},$m=a._emscripten_bind_b2ManifoldPoint_set_tangentImpulse_1=function(){return($m=a._emscripten_bind_b2ManifoldPoint_set_tangentImpulse_1=a.asm.Qk).apply(null,arguments)},an=a._emscripten_bind_b2ManifoldPoint_get_id_0=function(){return(an=a._emscripten_bind_b2ManifoldPoint_get_id_0=a.asm.Rk).apply(null,
arguments)},bn=a._emscripten_bind_b2ManifoldPoint_set_id_1=function(){return(bn=a._emscripten_bind_b2ManifoldPoint_set_id_1=a.asm.Sk).apply(null,arguments)},cn=a._emscripten_bind_b2ManifoldPoint___destroy___0=function(){return(cn=a._emscripten_bind_b2ManifoldPoint___destroy___0=a.asm.Tk).apply(null,arguments)},dn=a._emscripten_bind_b2Transform_b2Transform_0=function(){return(dn=a._emscripten_bind_b2Transform_b2Transform_0=a.asm.Uk).apply(null,arguments)},en=a._emscripten_bind_b2Transform_b2Transform_2=
function(){return(en=a._emscripten_bind_b2Transform_b2Transform_2=a.asm.Vk).apply(null,arguments)},fn=a._emscripten_bind_b2Transform_SetIdentity_0=function(){return(fn=a._emscripten_bind_b2Transform_SetIdentity_0=a.asm.Wk).apply(null,arguments)},gn=a._emscripten_bind_b2Transform_Set_2=function(){return(gn=a._emscripten_bind_b2Transform_Set_2=a.asm.Xk).apply(null,arguments)},hn=a._emscripten_bind_b2Transform_get_p_0=function(){return(hn=a._emscripten_bind_b2Transform_get_p_0=a.asm.Yk).apply(null,arguments)},
jn=a._emscripten_bind_b2Transform_set_p_1=function(){return(jn=a._emscripten_bind_b2Transform_set_p_1=a.asm.Zk).apply(null,arguments)},kn=a._emscripten_bind_b2Transform_get_q_0=function(){return(kn=a._emscripten_bind_b2Transform_get_q_0=a.asm._k).apply(null,arguments)},ln=a._emscripten_bind_b2Transform_set_q_1=function(){return(ln=a._emscripten_bind_b2Transform_set_q_1=a.asm.$k).apply(null,arguments)},mn=a._emscripten_bind_b2Transform___destroy___0=function(){return(mn=a._emscripten_bind_b2Transform___destroy___0=
a.asm.al).apply(null,arguments)},nn=a._emscripten_bind_b2ChainShape_b2ChainShape_0=function(){return(nn=a._emscripten_bind_b2ChainShape_b2ChainShape_0=a.asm.bl).apply(null,arguments)},on=a._emscripten_bind_b2ChainShape_Clear_0=function(){return(on=a._emscripten_bind_b2ChainShape_Clear_0=a.asm.cl).apply(null,arguments)},pn=a._emscripten_bind_b2ChainShape_CreateLoop_2=function(){return(pn=a._emscripten_bind_b2ChainShape_CreateLoop_2=a.asm.dl).apply(null,arguments)},qn=a._emscripten_bind_b2ChainShape_CreateChain_2=
function(){return(qn=a._emscripten_bind_b2ChainShape_CreateChain_2=a.asm.el).apply(null,arguments)},rn=a._emscripten_bind_b2ChainShape_SetPrevVertex_1=function(){return(rn=a._emscripten_bind_b2ChainShape_SetPrevVertex_1=a.asm.fl).apply(null,arguments)},sn=a._emscripten_bind_b2ChainShape_SetNextVertex_1=function(){return(sn=a._emscripten_bind_b2ChainShape_SetNextVertex_1=a.asm.gl).apply(null,arguments)},tn=a._emscripten_bind_b2ChainShape_GetChildEdge_2=function(){return(tn=a._emscripten_bind_b2ChainShape_GetChildEdge_2=
a.asm.hl).apply(null,arguments)},un=a._emscripten_bind_b2ChainShape_GetType_0=function(){return(un=a._emscripten_bind_b2ChainShape_GetType_0=a.asm.il).apply(null,arguments)},vn=a._emscripten_bind_b2ChainShape_GetChildCount_0=function(){return(vn=a._emscripten_bind_b2ChainShape_GetChildCount_0=a.asm.jl).apply(null,arguments)},wn=a._emscripten_bind_b2ChainShape_TestPoint_2=function(){return(wn=a._emscripten_bind_b2ChainShape_TestPoint_2=a.asm.kl).apply(null,arguments)},xn=a._emscripten_bind_b2ChainShape_RayCast_4=
function(){return(xn=a._emscripten_bind_b2ChainShape_RayCast_4=a.asm.ll).apply(null,arguments)},yn=a._emscripten_bind_b2ChainShape_ComputeAABB_3=function(){return(yn=a._emscripten_bind_b2ChainShape_ComputeAABB_3=a.asm.ml).apply(null,arguments)},zn=a._emscripten_bind_b2ChainShape_ComputeMass_2=function(){return(zn=a._emscripten_bind_b2ChainShape_ComputeMass_2=a.asm.nl).apply(null,arguments)},An=a._emscripten_bind_b2ChainShape_get_m_vertices_0=function(){return(An=a._emscripten_bind_b2ChainShape_get_m_vertices_0=
a.asm.ol).apply(null,arguments)},Bn=a._emscripten_bind_b2ChainShape_set_m_vertices_1=function(){return(Bn=a._emscripten_bind_b2ChainShape_set_m_vertices_1=a.asm.pl).apply(null,arguments)},Cn=a._emscripten_bind_b2ChainShape_get_m_count_0=function(){return(Cn=a._emscripten_bind_b2ChainShape_get_m_count_0=a.asm.ql).apply(null,arguments)},Dn=a._emscripten_bind_b2ChainShape_set_m_count_1=function(){return(Dn=a._emscripten_bind_b2ChainShape_set_m_count_1=a.asm.rl).apply(null,arguments)},En=a._emscripten_bind_b2ChainShape_get_m_prevVertex_0=
function(){return(En=a._emscripten_bind_b2ChainShape_get_m_prevVertex_0=a.asm.sl).apply(null,arguments)},Fn=a._emscripten_bind_b2ChainShape_set_m_prevVertex_1=function(){return(Fn=a._emscripten_bind_b2ChainShape_set_m_prevVertex_1=a.asm.tl).apply(null,arguments)},Gn=a._emscripten_bind_b2ChainShape_get_m_nextVertex_0=function(){return(Gn=a._emscripten_bind_b2ChainShape_get_m_nextVertex_0=a.asm.ul).apply(null,arguments)},Hn=a._emscripten_bind_b2ChainShape_set_m_nextVertex_1=function(){return(Hn=a._emscripten_bind_b2ChainShape_set_m_nextVertex_1=
a.asm.vl).apply(null,arguments)},In=a._emscripten_bind_b2ChainShape_get_m_hasPrevVertex_0=function(){return(In=a._emscripten_bind_b2ChainShape_get_m_hasPrevVertex_0=a.asm.wl).apply(null,arguments)},Jn=a._emscripten_bind_b2ChainShape_set_m_hasPrevVertex_1=function(){return(Jn=a._emscripten_bind_b2ChainShape_set_m_hasPrevVertex_1=a.asm.xl).apply(null,arguments)},Kn=a._emscripten_bind_b2ChainShape_get_m_hasNextVertex_0=function(){return(Kn=a._emscripten_bind_b2ChainShape_get_m_hasNextVertex_0=a.asm.yl).apply(null,
arguments)},Ln=a._emscripten_bind_b2ChainShape_set_m_hasNextVertex_1=function(){return(Ln=a._emscripten_bind_b2ChainShape_set_m_hasNextVertex_1=a.asm.zl).apply(null,arguments)},Mn=a._emscripten_bind_b2ChainShape_get_m_type_0=function(){return(Mn=a._emscripten_bind_b2ChainShape_get_m_type_0=a.asm.Al).apply(null,arguments)},Nn=a._emscripten_bind_b2ChainShape_set_m_type_1=function(){return(Nn=a._emscripten_bind_b2ChainShape_set_m_type_1=a.asm.Bl).apply(null,arguments)},On=a._emscripten_bind_b2ChainShape_get_m_radius_0=
function(){return(On=a._emscripten_bind_b2ChainShape_get_m_radius_0=a.asm.Cl).apply(null,arguments)},Pn=a._emscripten_bind_b2ChainShape_set_m_radius_1=function(){return(Pn=a._emscripten_bind_b2ChainShape_set_m_radius_1=a.asm.Dl).apply(null,arguments)},Qn=a._emscripten_bind_b2ChainShape___destroy___0=function(){return(Qn=a._emscripten_bind_b2ChainShape___destroy___0=a.asm.El).apply(null,arguments)},Rn=a._emscripten_bind_b2Color_b2Color_0=function(){return(Rn=a._emscripten_bind_b2Color_b2Color_0=a.asm.Fl).apply(null,
arguments)},Sn=a._emscripten_bind_b2Color_b2Color_3=function(){return(Sn=a._emscripten_bind_b2Color_b2Color_3=a.asm.Gl).apply(null,arguments)},Tn=a._emscripten_bind_b2Color_Set_3=function(){return(Tn=a._emscripten_bind_b2Color_Set_3=a.asm.Hl).apply(null,arguments)},Un=a._emscripten_bind_b2Color_get_r_0=function(){return(Un=a._emscripten_bind_b2Color_get_r_0=a.asm.Il).apply(null,arguments)},Vn=a._emscripten_bind_b2Color_set_r_1=function(){return(Vn=a._emscripten_bind_b2Color_set_r_1=a.asm.Jl).apply(null,
arguments)},Wn=a._emscripten_bind_b2Color_get_g_0=function(){return(Wn=a._emscripten_bind_b2Color_get_g_0=a.asm.Kl).apply(null,arguments)},Xn=a._emscripten_bind_b2Color_set_g_1=function(){return(Xn=a._emscripten_bind_b2Color_set_g_1=a.asm.Ll).apply(null,arguments)},Yn=a._emscripten_bind_b2Color_get_b_0=function(){return(Yn=a._emscripten_bind_b2Color_get_b_0=a.asm.Ml).apply(null,arguments)},Zn=a._emscripten_bind_b2Color_set_b_1=function(){return(Zn=a._emscripten_bind_b2Color_set_b_1=a.asm.Nl).apply(null,
arguments)},$n=a._emscripten_bind_b2Color___destroy___0=function(){return($n=a._emscripten_bind_b2Color___destroy___0=a.asm.Ol).apply(null,arguments)},ao=a._emscripten_bind_b2RopeJoint_GetLocalAnchorA_0=function(){return(ao=a._emscripten_bind_b2RopeJoint_GetLocalAnchorA_0=a.asm.Pl).apply(null,arguments)},bo=a._emscripten_bind_b2RopeJoint_GetLocalAnchorB_0=function(){return(bo=a._emscripten_bind_b2RopeJoint_GetLocalAnchorB_0=a.asm.Ql).apply(null,arguments)},co=a._emscripten_bind_b2RopeJoint_SetMaxLength_1=
function(){return(co=a._emscripten_bind_b2RopeJoint_SetMaxLength_1=a.asm.Rl).apply(null,arguments)},eo=a._emscripten_bind_b2RopeJoint_GetMaxLength_0=function(){return(eo=a._emscripten_bind_b2RopeJoint_GetMaxLength_0=a.asm.Sl).apply(null,arguments)},fo=a._emscripten_bind_b2RopeJoint_GetLimitState_0=function(){return(fo=a._emscripten_bind_b2RopeJoint_GetLimitState_0=a.asm.Tl).apply(null,arguments)},go=a._emscripten_bind_b2RopeJoint_GetType_0=function(){return(go=a._emscripten_bind_b2RopeJoint_GetType_0=
a.asm.Ul).apply(null,arguments)},ho=a._emscripten_bind_b2RopeJoint_GetBodyA_0=function(){return(ho=a._emscripten_bind_b2RopeJoint_GetBodyA_0=a.asm.Vl).apply(null,arguments)},io=a._emscripten_bind_b2RopeJoint_GetBodyB_0=function(){return(io=a._emscripten_bind_b2RopeJoint_GetBodyB_0=a.asm.Wl).apply(null,arguments)},jo=a._emscripten_bind_b2RopeJoint_GetAnchorA_0=function(){return(jo=a._emscripten_bind_b2RopeJoint_GetAnchorA_0=a.asm.Xl).apply(null,arguments)},ko=a._emscripten_bind_b2RopeJoint_GetAnchorB_0=
function(){return(ko=a._emscripten_bind_b2RopeJoint_GetAnchorB_0=a.asm.Yl).apply(null,arguments)},lo=a._emscripten_bind_b2RopeJoint_GetReactionForce_1=function(){return(lo=a._emscripten_bind_b2RopeJoint_GetReactionForce_1=a.asm.Zl).apply(null,arguments)},mo=a._emscripten_bind_b2RopeJoint_GetReactionTorque_1=function(){return(mo=a._emscripten_bind_b2RopeJoint_GetReactionTorque_1=a.asm._l).apply(null,arguments)},no=a._emscripten_bind_b2RopeJoint_GetNext_0=function(){return(no=a._emscripten_bind_b2RopeJoint_GetNext_0=
a.asm.$l).apply(null,arguments)},oo=a._emscripten_bind_b2RopeJoint_GetUserData_0=function(){return(oo=a._emscripten_bind_b2RopeJoint_GetUserData_0=a.asm.am).apply(null,arguments)},po=a._emscripten_bind_b2RopeJoint_SetUserData_1=function(){return(po=a._emscripten_bind_b2RopeJoint_SetUserData_1=a.asm.bm).apply(null,arguments)},qo=a._emscripten_bind_b2RopeJoint_IsActive_0=function(){return(qo=a._emscripten_bind_b2RopeJoint_IsActive_0=a.asm.cm).apply(null,arguments)},ro=a._emscripten_bind_b2RopeJoint_GetCollideConnected_0=
function(){return(ro=a._emscripten_bind_b2RopeJoint_GetCollideConnected_0=a.asm.dm).apply(null,arguments)},so=a._emscripten_bind_b2RopeJoint___destroy___0=function(){return(so=a._emscripten_bind_b2RopeJoint___destroy___0=a.asm.em).apply(null,arguments)},to=a._emscripten_bind_b2RayCastInput_get_p1_0=function(){return(to=a._emscripten_bind_b2RayCastInput_get_p1_0=a.asm.fm).apply(null,arguments)},uo=a._emscripten_bind_b2RayCastInput_set_p1_1=function(){return(uo=a._emscripten_bind_b2RayCastInput_set_p1_1=
a.asm.gm).apply(null,arguments)},vo=a._emscripten_bind_b2RayCastInput_get_p2_0=function(){return(vo=a._emscripten_bind_b2RayCastInput_get_p2_0=a.asm.hm).apply(null,arguments)},wo=a._emscripten_bind_b2RayCastInput_set_p2_1=function(){return(wo=a._emscripten_bind_b2RayCastInput_set_p2_1=a.asm.im).apply(null,arguments)},xo=a._emscripten_bind_b2RayCastInput_get_maxFraction_0=function(){return(xo=a._emscripten_bind_b2RayCastInput_get_maxFraction_0=a.asm.jm).apply(null,arguments)},yo=a._emscripten_bind_b2RayCastInput_set_maxFraction_1=
function(){return(yo=a._emscripten_bind_b2RayCastInput_set_maxFraction_1=a.asm.km).apply(null,arguments)},zo=a._emscripten_bind_b2RayCastInput___destroy___0=function(){return(zo=a._emscripten_bind_b2RayCastInput___destroy___0=a.asm.lm).apply(null,arguments)},Ao=a._emscripten_bind_b2PolygonShape_b2PolygonShape_0=function(){return(Ao=a._emscripten_bind_b2PolygonShape_b2PolygonShape_0=a.asm.mm).apply(null,arguments)},Bo=a._emscripten_bind_b2PolygonShape_Set_2=function(){return(Bo=a._emscripten_bind_b2PolygonShape_Set_2=
a.asm.nm).apply(null,arguments)},Co=a._emscripten_bind_b2PolygonShape_SetAsBox_2=function(){return(Co=a._emscripten_bind_b2PolygonShape_SetAsBox_2=a.asm.om).apply(null,arguments)},Do=a._emscripten_bind_b2PolygonShape_SetAsBox_4=function(){return(Do=a._emscripten_bind_b2PolygonShape_SetAsBox_4=a.asm.pm).apply(null,arguments)},Eo=a._emscripten_bind_b2PolygonShape_GetVertexCount_0=function(){return(Eo=a._emscripten_bind_b2PolygonShape_GetVertexCount_0=a.asm.qm).apply(null,arguments)},Fo=a._emscripten_bind_b2PolygonShape_GetVertex_1=
function(){return(Fo=a._emscripten_bind_b2PolygonShape_GetVertex_1=a.asm.rm).apply(null,arguments)},Go=a._emscripten_bind_b2PolygonShape_GetType_0=function(){return(Go=a._emscripten_bind_b2PolygonShape_GetType_0=a.asm.sm).apply(null,arguments)},Ho=a._emscripten_bind_b2PolygonShape_GetChildCount_0=function(){return(Ho=a._emscripten_bind_b2PolygonShape_GetChildCount_0=a.asm.tm).apply(null,arguments)},Io=a._emscripten_bind_b2PolygonShape_TestPoint_2=function(){return(Io=a._emscripten_bind_b2PolygonShape_TestPoint_2=
a.asm.um).apply(null,arguments)},Jo=a._emscripten_bind_b2PolygonShape_RayCast_4=function(){return(Jo=a._emscripten_bind_b2PolygonShape_RayCast_4=a.asm.vm).apply(null,arguments)},Ko=a._emscripten_bind_b2PolygonShape_ComputeAABB_3=function(){return(Ko=a._emscripten_bind_b2PolygonShape_ComputeAABB_3=a.asm.wm).apply(null,arguments)},Lo=a._emscripten_bind_b2PolygonShape_ComputeMass_2=function(){return(Lo=a._emscripten_bind_b2PolygonShape_ComputeMass_2=a.asm.xm).apply(null,arguments)},Mo=a._emscripten_bind_b2PolygonShape_get_m_centroid_0=
function(){return(Mo=a._emscripten_bind_b2PolygonShape_get_m_centroid_0=a.asm.ym).apply(null,arguments)},No=a._emscripten_bind_b2PolygonShape_set_m_centroid_1=function(){return(No=a._emscripten_bind_b2PolygonShape_set_m_centroid_1=a.asm.zm).apply(null,arguments)},Oo=a._emscripten_bind_b2PolygonShape_get_m_count_0=function(){return(Oo=a._emscripten_bind_b2PolygonShape_get_m_count_0=a.asm.Am).apply(null,arguments)},Po=a._emscripten_bind_b2PolygonShape_set_m_count_1=function(){return(Po=a._emscripten_bind_b2PolygonShape_set_m_count_1=
a.asm.Bm).apply(null,arguments)},Qo=a._emscripten_bind_b2PolygonShape_get_m_type_0=function(){return(Qo=a._emscripten_bind_b2PolygonShape_get_m_type_0=a.asm.Cm).apply(null,arguments)},Ro=a._emscripten_bind_b2PolygonShape_set_m_type_1=function(){return(Ro=a._emscripten_bind_b2PolygonShape_set_m_type_1=a.asm.Dm).apply(null,arguments)},So=a._emscripten_bind_b2PolygonShape_get_m_radius_0=function(){return(So=a._emscripten_bind_b2PolygonShape_get_m_radius_0=a.asm.Em).apply(null,arguments)},To=a._emscripten_bind_b2PolygonShape_set_m_radius_1=
function(){return(To=a._emscripten_bind_b2PolygonShape_set_m_radius_1=a.asm.Fm).apply(null,arguments)},Uo=a._emscripten_bind_b2PolygonShape___destroy___0=function(){return(Uo=a._emscripten_bind_b2PolygonShape___destroy___0=a.asm.Gm).apply(null,arguments)},Vo=a._emscripten_bind_b2EdgeShape_b2EdgeShape_0=function(){return(Vo=a._emscripten_bind_b2EdgeShape_b2EdgeShape_0=a.asm.Hm).apply(null,arguments)},Wo=a._emscripten_bind_b2EdgeShape_Set_2=function(){return(Wo=a._emscripten_bind_b2EdgeShape_Set_2=
a.asm.Im).apply(null,arguments)},Xo=a._emscripten_bind_b2EdgeShape_GetType_0=function(){return(Xo=a._emscripten_bind_b2EdgeShape_GetType_0=a.asm.Jm).apply(null,arguments)},Yo=a._emscripten_bind_b2EdgeShape_GetChildCount_0=function(){return(Yo=a._emscripten_bind_b2EdgeShape_GetChildCount_0=a.asm.Km).apply(null,arguments)},Zo=a._emscripten_bind_b2EdgeShape_TestPoint_2=function(){return(Zo=a._emscripten_bind_b2EdgeShape_TestPoint_2=a.asm.Lm).apply(null,arguments)},$o=a._emscripten_bind_b2EdgeShape_RayCast_4=
function(){return($o=a._emscripten_bind_b2EdgeShape_RayCast_4=a.asm.Mm).apply(null,arguments)},ap=a._emscripten_bind_b2EdgeShape_ComputeAABB_3=function(){return(ap=a._emscripten_bind_b2EdgeShape_ComputeAABB_3=a.asm.Nm).apply(null,arguments)},bp=a._emscripten_bind_b2EdgeShape_ComputeMass_2=function(){return(bp=a._emscripten_bind_b2EdgeShape_ComputeMass_2=a.asm.Om).apply(null,arguments)},cp=a._emscripten_bind_b2EdgeShape_get_m_vertex1_0=function(){return(cp=a._emscripten_bind_b2EdgeShape_get_m_vertex1_0=
a.asm.Pm).apply(null,arguments)},dp=a._emscripten_bind_b2EdgeShape_set_m_vertex1_1=function(){return(dp=a._emscripten_bind_b2EdgeShape_set_m_vertex1_1=a.asm.Qm).apply(null,arguments)},ep=a._emscripten_bind_b2EdgeShape_get_m_vertex2_0=function(){return(ep=a._emscripten_bind_b2EdgeShape_get_m_vertex2_0=a.asm.Rm).apply(null,arguments)},fp=a._emscripten_bind_b2EdgeShape_set_m_vertex2_1=function(){return(fp=a._emscripten_bind_b2EdgeShape_set_m_vertex2_1=a.asm.Sm).apply(null,arguments)},gp=a._emscripten_bind_b2EdgeShape_get_m_vertex0_0=
function(){return(gp=a._emscripten_bind_b2EdgeShape_get_m_vertex0_0=a.asm.Tm).apply(null,arguments)},hp=a._emscripten_bind_b2EdgeShape_set_m_vertex0_1=function(){return(hp=a._emscripten_bind_b2EdgeShape_set_m_vertex0_1=a.asm.Um).apply(null,arguments)},ip=a._emscripten_bind_b2EdgeShape_get_m_vertex3_0=function(){return(ip=a._emscripten_bind_b2EdgeShape_get_m_vertex3_0=a.asm.Vm).apply(null,arguments)},jp=a._emscripten_bind_b2EdgeShape_set_m_vertex3_1=function(){return(jp=a._emscripten_bind_b2EdgeShape_set_m_vertex3_1=
a.asm.Wm).apply(null,arguments)},kp=a._emscripten_bind_b2EdgeShape_get_m_hasVertex0_0=function(){return(kp=a._emscripten_bind_b2EdgeShape_get_m_hasVertex0_0=a.asm.Xm).apply(null,arguments)},lp=a._emscripten_bind_b2EdgeShape_set_m_hasVertex0_1=function(){return(lp=a._emscripten_bind_b2EdgeShape_set_m_hasVertex0_1=a.asm.Ym).apply(null,arguments)},mp=a._emscripten_bind_b2EdgeShape_get_m_hasVertex3_0=function(){return(mp=a._emscripten_bind_b2EdgeShape_get_m_hasVertex3_0=a.asm.Zm).apply(null,arguments)},
np=a._emscripten_bind_b2EdgeShape_set_m_hasVertex3_1=function(){return(np=a._emscripten_bind_b2EdgeShape_set_m_hasVertex3_1=a.asm._m).apply(null,arguments)},op=a._emscripten_bind_b2EdgeShape_get_m_type_0=function(){return(op=a._emscripten_bind_b2EdgeShape_get_m_type_0=a.asm.$m).apply(null,arguments)},pp=a._emscripten_bind_b2EdgeShape_set_m_type_1=function(){return(pp=a._emscripten_bind_b2EdgeShape_set_m_type_1=a.asm.an).apply(null,arguments)},qp=a._emscripten_bind_b2EdgeShape_get_m_radius_0=function(){return(qp=
a._emscripten_bind_b2EdgeShape_get_m_radius_0=a.asm.bn).apply(null,arguments)},rp=a._emscripten_bind_b2EdgeShape_set_m_radius_1=function(){return(rp=a._emscripten_bind_b2EdgeShape_set_m_radius_1=a.asm.cn).apply(null,arguments)},sp=a._emscripten_bind_b2EdgeShape___destroy___0=function(){return(sp=a._emscripten_bind_b2EdgeShape___destroy___0=a.asm.dn).apply(null,arguments)},tp=a._emscripten_bind_JSContactFilter_JSContactFilter_0=function(){return(tp=a._emscripten_bind_JSContactFilter_JSContactFilter_0=
a.asm.en).apply(null,arguments)},up=a._emscripten_bind_JSContactFilter_ShouldCollide_2=function(){return(up=a._emscripten_bind_JSContactFilter_ShouldCollide_2=a.asm.fn).apply(null,arguments)},vp=a._emscripten_bind_JSContactFilter___destroy___0=function(){return(vp=a._emscripten_bind_JSContactFilter___destroy___0=a.asm.gn).apply(null,arguments)},wp=a._emscripten_bind_b2RevoluteJointDef_b2RevoluteJointDef_0=function(){return(wp=a._emscripten_bind_b2RevoluteJointDef_b2RevoluteJointDef_0=a.asm.hn).apply(null,
arguments)},xp=a._emscripten_bind_b2RevoluteJointDef_Initialize_3=function(){return(xp=a._emscripten_bind_b2RevoluteJointDef_Initialize_3=a.asm.jn).apply(null,arguments)},yp=a._emscripten_bind_b2RevoluteJointDef_get_localAnchorA_0=function(){return(yp=a._emscripten_bind_b2RevoluteJointDef_get_localAnchorA_0=a.asm.kn).apply(null,arguments)},zp=a._emscripten_bind_b2RevoluteJointDef_set_localAnchorA_1=function(){return(zp=a._emscripten_bind_b2RevoluteJointDef_set_localAnchorA_1=a.asm.ln).apply(null,
arguments)},Ap=a._emscripten_bind_b2RevoluteJointDef_get_localAnchorB_0=function(){return(Ap=a._emscripten_bind_b2RevoluteJointDef_get_localAnchorB_0=a.asm.mn).apply(null,arguments)},Bp=a._emscripten_bind_b2RevoluteJointDef_set_localAnchorB_1=function(){return(Bp=a._emscripten_bind_b2RevoluteJointDef_set_localAnchorB_1=a.asm.nn).apply(null,arguments)},Cp=a._emscripten_bind_b2RevoluteJointDef_get_referenceAngle_0=function(){return(Cp=a._emscripten_bind_b2RevoluteJointDef_get_referenceAngle_0=a.asm.on).apply(null,
arguments)},Dp=a._emscripten_bind_b2RevoluteJointDef_set_referenceAngle_1=function(){return(Dp=a._emscripten_bind_b2RevoluteJointDef_set_referenceAngle_1=a.asm.pn).apply(null,arguments)},Ep=a._emscripten_bind_b2RevoluteJointDef_get_enableLimit_0=function(){return(Ep=a._emscripten_bind_b2RevoluteJointDef_get_enableLimit_0=a.asm.qn).apply(null,arguments)},Fp=a._emscripten_bind_b2RevoluteJointDef_set_enableLimit_1=function(){return(Fp=a._emscripten_bind_b2RevoluteJointDef_set_enableLimit_1=a.asm.rn).apply(null,
arguments)},Gp=a._emscripten_bind_b2RevoluteJointDef_get_lowerAngle_0=function(){return(Gp=a._emscripten_bind_b2RevoluteJointDef_get_lowerAngle_0=a.asm.sn).apply(null,arguments)},Hp=a._emscripten_bind_b2RevoluteJointDef_set_lowerAngle_1=function(){return(Hp=a._emscripten_bind_b2RevoluteJointDef_set_lowerAngle_1=a.asm.tn).apply(null,arguments)},Ip=a._emscripten_bind_b2RevoluteJointDef_get_upperAngle_0=function(){return(Ip=a._emscripten_bind_b2RevoluteJointDef_get_upperAngle_0=a.asm.un).apply(null,
arguments)},Jp=a._emscripten_bind_b2RevoluteJointDef_set_upperAngle_1=function(){return(Jp=a._emscripten_bind_b2RevoluteJointDef_set_upperAngle_1=a.asm.vn).apply(null,arguments)},Kp=a._emscripten_bind_b2RevoluteJointDef_get_enableMotor_0=function(){return(Kp=a._emscripten_bind_b2RevoluteJointDef_get_enableMotor_0=a.asm.wn).apply(null,arguments)},Lp=a._emscripten_bind_b2RevoluteJointDef_set_enableMotor_1=function(){return(Lp=a._emscripten_bind_b2RevoluteJointDef_set_enableMotor_1=a.asm.xn).apply(null,
arguments)},Mp=a._emscripten_bind_b2RevoluteJointDef_get_motorSpeed_0=function(){return(Mp=a._emscripten_bind_b2RevoluteJointDef_get_motorSpeed_0=a.asm.yn).apply(null,arguments)},Np=a._emscripten_bind_b2RevoluteJointDef_set_motorSpeed_1=function(){return(Np=a._emscripten_bind_b2RevoluteJointDef_set_motorSpeed_1=a.asm.zn).apply(null,arguments)},Op=a._emscripten_bind_b2RevoluteJointDef_get_maxMotorTorque_0=function(){return(Op=a._emscripten_bind_b2RevoluteJointDef_get_maxMotorTorque_0=a.asm.An).apply(null,
arguments)},Pp=a._emscripten_bind_b2RevoluteJointDef_set_maxMotorTorque_1=function(){return(Pp=a._emscripten_bind_b2RevoluteJointDef_set_maxMotorTorque_1=a.asm.Bn).apply(null,arguments)},Qp=a._emscripten_bind_b2RevoluteJointDef_get_type_0=function(){return(Qp=a._emscripten_bind_b2RevoluteJointDef_get_type_0=a.asm.Cn).apply(null,arguments)},Rp=a._emscripten_bind_b2RevoluteJointDef_set_type_1=function(){return(Rp=a._emscripten_bind_b2RevoluteJointDef_set_type_1=a.asm.Dn).apply(null,arguments)},Sp=a._emscripten_bind_b2RevoluteJointDef_get_userData_0=
function(){return(Sp=a._emscripten_bind_b2RevoluteJointDef_get_userData_0=a.asm.En).apply(null,arguments)},Tp=a._emscripten_bind_b2RevoluteJointDef_set_userData_1=function(){return(Tp=a._emscripten_bind_b2RevoluteJointDef_set_userData_1=a.asm.Fn).apply(null,arguments)},Up=a._emscripten_bind_b2RevoluteJointDef_get_bodyA_0=function(){return(Up=a._emscripten_bind_b2RevoluteJointDef_get_bodyA_0=a.asm.Gn).apply(null,arguments)},Vp=a._emscripten_bind_b2RevoluteJointDef_set_bodyA_1=function(){return(Vp=
a._emscripten_bind_b2RevoluteJointDef_set_bodyA_1=a.asm.Hn).apply(null,arguments)},Wp=a._emscripten_bind_b2RevoluteJointDef_get_bodyB_0=function(){return(Wp=a._emscripten_bind_b2RevoluteJointDef_get_bodyB_0=a.asm.In).apply(null,arguments)},Xp=a._emscripten_bind_b2RevoluteJointDef_set_bodyB_1=function(){return(Xp=a._emscripten_bind_b2RevoluteJointDef_set_bodyB_1=a.asm.Jn).apply(null,arguments)},Yp=a._emscripten_bind_b2RevoluteJointDef_get_collideConnected_0=function(){return(Yp=a._emscripten_bind_b2RevoluteJointDef_get_collideConnected_0=
a.asm.Kn).apply(null,arguments)},Zp=a._emscripten_bind_b2RevoluteJointDef_set_collideConnected_1=function(){return(Zp=a._emscripten_bind_b2RevoluteJointDef_set_collideConnected_1=a.asm.Ln).apply(null,arguments)},$p=a._emscripten_bind_b2RevoluteJointDef___destroy___0=function(){return($p=a._emscripten_bind_b2RevoluteJointDef___destroy___0=a.asm.Mn).apply(null,arguments)},aq=a._emscripten_bind_JSDraw_JSDraw_0=function(){return(aq=a._emscripten_bind_JSDraw_JSDraw_0=a.asm.Nn).apply(null,arguments)},bq=
a._emscripten_bind_JSDraw_DrawPolygon_3=function(){return(bq=a._emscripten_bind_JSDraw_DrawPolygon_3=a.asm.On).apply(null,arguments)},cq=a._emscripten_bind_JSDraw_DrawSolidPolygon_3=function(){return(cq=a._emscripten_bind_JSDraw_DrawSolidPolygon_3=a.asm.Pn).apply(null,arguments)},dq=a._emscripten_bind_JSDraw_DrawCircle_3=function(){return(dq=a._emscripten_bind_JSDraw_DrawCircle_3=a.asm.Qn).apply(null,arguments)},eq=a._emscripten_bind_JSDraw_DrawSolidCircle_4=function(){return(eq=a._emscripten_bind_JSDraw_DrawSolidCircle_4=
a.asm.Rn).apply(null,arguments)},fq=a._emscripten_bind_JSDraw_DrawSegment_3=function(){return(fq=a._emscripten_bind_JSDraw_DrawSegment_3=a.asm.Sn).apply(null,arguments)},gq=a._emscripten_bind_JSDraw_DrawTransform_1=function(){return(gq=a._emscripten_bind_JSDraw_DrawTransform_1=a.asm.Tn).apply(null,arguments)},hq=a._emscripten_bind_JSDraw___destroy___0=function(){return(hq=a._emscripten_bind_JSDraw___destroy___0=a.asm.Un).apply(null,arguments)},iq=a._emscripten_bind_b2WheelJoint_GetLocalAnchorA_0=
function(){return(iq=a._emscripten_bind_b2WheelJoint_GetLocalAnchorA_0=a.asm.Vn).apply(null,arguments)},jq=a._emscripten_bind_b2WheelJoint_GetLocalAnchorB_0=function(){return(jq=a._emscripten_bind_b2WheelJoint_GetLocalAnchorB_0=a.asm.Wn).apply(null,arguments)},kq=a._emscripten_bind_b2WheelJoint_GetLocalAxisA_0=function(){return(kq=a._emscripten_bind_b2WheelJoint_GetLocalAxisA_0=a.asm.Xn).apply(null,arguments)},lq=a._emscripten_bind_b2WheelJoint_GetJointTranslation_0=function(){return(lq=a._emscripten_bind_b2WheelJoint_GetJointTranslation_0=
a.asm.Yn).apply(null,arguments)},mq=a._emscripten_bind_b2WheelJoint_GetJointSpeed_0=function(){return(mq=a._emscripten_bind_b2WheelJoint_GetJointSpeed_0=a.asm.Zn).apply(null,arguments)},nq=a._emscripten_bind_b2WheelJoint_IsMotorEnabled_0=function(){return(nq=a._emscripten_bind_b2WheelJoint_IsMotorEnabled_0=a.asm._n).apply(null,arguments)},oq=a._emscripten_bind_b2WheelJoint_EnableMotor_1=function(){return(oq=a._emscripten_bind_b2WheelJoint_EnableMotor_1=a.asm.$n).apply(null,arguments)},pq=a._emscripten_bind_b2WheelJoint_SetMotorSpeed_1=
function(){return(pq=a._emscripten_bind_b2WheelJoint_SetMotorSpeed_1=a.asm.ao).apply(null,arguments)},qq=a._emscripten_bind_b2WheelJoint_GetMotorSpeed_0=function(){return(qq=a._emscripten_bind_b2WheelJoint_GetMotorSpeed_0=a.asm.bo).apply(null,arguments)},rq=a._emscripten_bind_b2WheelJoint_SetMaxMotorTorque_1=function(){return(rq=a._emscripten_bind_b2WheelJoint_SetMaxMotorTorque_1=a.asm.co).apply(null,arguments)},sq=a._emscripten_bind_b2WheelJoint_GetMaxMotorTorque_0=function(){return(sq=a._emscripten_bind_b2WheelJoint_GetMaxMotorTorque_0=
a.asm.eo).apply(null,arguments)},tq=a._emscripten_bind_b2WheelJoint_GetMotorTorque_1=function(){return(tq=a._emscripten_bind_b2WheelJoint_GetMotorTorque_1=a.asm.fo).apply(null,arguments)},uq=a._emscripten_bind_b2WheelJoint_SetSpringFrequencyHz_1=function(){return(uq=a._emscripten_bind_b2WheelJoint_SetSpringFrequencyHz_1=a.asm.go).apply(null,arguments)},vq=a._emscripten_bind_b2WheelJoint_GetSpringFrequencyHz_0=function(){return(vq=a._emscripten_bind_b2WheelJoint_GetSpringFrequencyHz_0=a.asm.ho).apply(null,
arguments)},wq=a._emscripten_bind_b2WheelJoint_SetSpringDampingRatio_1=function(){return(wq=a._emscripten_bind_b2WheelJoint_SetSpringDampingRatio_1=a.asm.io).apply(null,arguments)},xq=a._emscripten_bind_b2WheelJoint_GetSpringDampingRatio_0=function(){return(xq=a._emscripten_bind_b2WheelJoint_GetSpringDampingRatio_0=a.asm.jo).apply(null,arguments)},yq=a._emscripten_bind_b2WheelJoint_GetType_0=function(){return(yq=a._emscripten_bind_b2WheelJoint_GetType_0=a.asm.ko).apply(null,arguments)},zq=a._emscripten_bind_b2WheelJoint_GetBodyA_0=
function(){return(zq=a._emscripten_bind_b2WheelJoint_GetBodyA_0=a.asm.lo).apply(null,arguments)},Aq=a._emscripten_bind_b2WheelJoint_GetBodyB_0=function(){return(Aq=a._emscripten_bind_b2WheelJoint_GetBodyB_0=a.asm.mo).apply(null,arguments)},Bq=a._emscripten_bind_b2WheelJoint_GetAnchorA_0=function(){return(Bq=a._emscripten_bind_b2WheelJoint_GetAnchorA_0=a.asm.no).apply(null,arguments)},Cq=a._emscripten_bind_b2WheelJoint_GetAnchorB_0=function(){return(Cq=a._emscripten_bind_b2WheelJoint_GetAnchorB_0=
a.asm.oo).apply(null,arguments)},Dq=a._emscripten_bind_b2WheelJoint_GetReactionForce_1=function(){return(Dq=a._emscripten_bind_b2WheelJoint_GetReactionForce_1=a.asm.po).apply(null,arguments)},Eq=a._emscripten_bind_b2WheelJoint_GetReactionTorque_1=function(){return(Eq=a._emscripten_bind_b2WheelJoint_GetReactionTorque_1=a.asm.qo).apply(null,arguments)},Fq=a._emscripten_bind_b2WheelJoint_GetNext_0=function(){return(Fq=a._emscripten_bind_b2WheelJoint_GetNext_0=a.asm.ro).apply(null,arguments)},Gq=a._emscripten_bind_b2WheelJoint_GetUserData_0=
function(){return(Gq=a._emscripten_bind_b2WheelJoint_GetUserData_0=a.asm.so).apply(null,arguments)},Hq=a._emscripten_bind_b2WheelJoint_SetUserData_1=function(){return(Hq=a._emscripten_bind_b2WheelJoint_SetUserData_1=a.asm.to).apply(null,arguments)},Iq=a._emscripten_bind_b2WheelJoint_IsActive_0=function(){return(Iq=a._emscripten_bind_b2WheelJoint_IsActive_0=a.asm.uo).apply(null,arguments)},Jq=a._emscripten_bind_b2WheelJoint_GetCollideConnected_0=function(){return(Jq=a._emscripten_bind_b2WheelJoint_GetCollideConnected_0=
a.asm.vo).apply(null,arguments)},Kq=a._emscripten_bind_b2WheelJoint___destroy___0=function(){return(Kq=a._emscripten_bind_b2WheelJoint___destroy___0=a.asm.wo).apply(null,arguments)},Lq=a._emscripten_bind_b2PulleyJoint_GetGroundAnchorA_0=function(){return(Lq=a._emscripten_bind_b2PulleyJoint_GetGroundAnchorA_0=a.asm.xo).apply(null,arguments)},Mq=a._emscripten_bind_b2PulleyJoint_GetGroundAnchorB_0=function(){return(Mq=a._emscripten_bind_b2PulleyJoint_GetGroundAnchorB_0=a.asm.yo).apply(null,arguments)},
Nq=a._emscripten_bind_b2PulleyJoint_GetLengthA_0=function(){return(Nq=a._emscripten_bind_b2PulleyJoint_GetLengthA_0=a.asm.zo).apply(null,arguments)},Oq=a._emscripten_bind_b2PulleyJoint_GetLengthB_0=function(){return(Oq=a._emscripten_bind_b2PulleyJoint_GetLengthB_0=a.asm.Ao).apply(null,arguments)},Pq=a._emscripten_bind_b2PulleyJoint_GetRatio_0=function(){return(Pq=a._emscripten_bind_b2PulleyJoint_GetRatio_0=a.asm.Bo).apply(null,arguments)},Qq=a._emscripten_bind_b2PulleyJoint_GetCurrentLengthA_0=function(){return(Qq=
a._emscripten_bind_b2PulleyJoint_GetCurrentLengthA_0=a.asm.Co).apply(null,arguments)},Rq=a._emscripten_bind_b2PulleyJoint_GetCurrentLengthB_0=function(){return(Rq=a._emscripten_bind_b2PulleyJoint_GetCurrentLengthB_0=a.asm.Do).apply(null,arguments)},Sq=a._emscripten_bind_b2PulleyJoint_GetType_0=function(){return(Sq=a._emscripten_bind_b2PulleyJoint_GetType_0=a.asm.Eo).apply(null,arguments)},Tq=a._emscripten_bind_b2PulleyJoint_GetBodyA_0=function(){return(Tq=a._emscripten_bind_b2PulleyJoint_GetBodyA_0=
a.asm.Fo).apply(null,arguments)},Uq=a._emscripten_bind_b2PulleyJoint_GetBodyB_0=function(){return(Uq=a._emscripten_bind_b2PulleyJoint_GetBodyB_0=a.asm.Go).apply(null,arguments)},Vq=a._emscripten_bind_b2PulleyJoint_GetAnchorA_0=function(){return(Vq=a._emscripten_bind_b2PulleyJoint_GetAnchorA_0=a.asm.Ho).apply(null,arguments)},Wq=a._emscripten_bind_b2PulleyJoint_GetAnchorB_0=function(){return(Wq=a._emscripten_bind_b2PulleyJoint_GetAnchorB_0=a.asm.Io).apply(null,arguments)},Xq=a._emscripten_bind_b2PulleyJoint_GetReactionForce_1=
function(){return(Xq=a._emscripten_bind_b2PulleyJoint_GetReactionForce_1=a.asm.Jo).apply(null,arguments)},Yq=a._emscripten_bind_b2PulleyJoint_GetReactionTorque_1=function(){return(Yq=a._emscripten_bind_b2PulleyJoint_GetReactionTorque_1=a.asm.Ko).apply(null,arguments)},Zq=a._emscripten_bind_b2PulleyJoint_GetNext_0=function(){return(Zq=a._emscripten_bind_b2PulleyJoint_GetNext_0=a.asm.Lo).apply(null,arguments)},$q=a._emscripten_bind_b2PulleyJoint_GetUserData_0=function(){return($q=a._emscripten_bind_b2PulleyJoint_GetUserData_0=
a.asm.Mo).apply(null,arguments)},ar=a._emscripten_bind_b2PulleyJoint_SetUserData_1=function(){return(ar=a._emscripten_bind_b2PulleyJoint_SetUserData_1=a.asm.No).apply(null,arguments)},br=a._emscripten_bind_b2PulleyJoint_IsActive_0=function(){return(br=a._emscripten_bind_b2PulleyJoint_IsActive_0=a.asm.Oo).apply(null,arguments)},cr=a._emscripten_bind_b2PulleyJoint_GetCollideConnected_0=function(){return(cr=a._emscripten_bind_b2PulleyJoint_GetCollideConnected_0=a.asm.Po).apply(null,arguments)},dr=a._emscripten_bind_b2PulleyJoint___destroy___0=
function(){return(dr=a._emscripten_bind_b2PulleyJoint___destroy___0=a.asm.Qo).apply(null,arguments)},er=a._emscripten_bind_b2MouseJointDef_b2MouseJointDef_0=function(){return(er=a._emscripten_bind_b2MouseJointDef_b2MouseJointDef_0=a.asm.Ro).apply(null,arguments)},fr=a._emscripten_bind_b2MouseJointDef_get_target_0=function(){return(fr=a._emscripten_bind_b2MouseJointDef_get_target_0=a.asm.So).apply(null,arguments)},gr=a._emscripten_bind_b2MouseJointDef_set_target_1=function(){return(gr=a._emscripten_bind_b2MouseJointDef_set_target_1=
a.asm.To).apply(null,arguments)},hr=a._emscripten_bind_b2MouseJointDef_get_maxForce_0=function(){return(hr=a._emscripten_bind_b2MouseJointDef_get_maxForce_0=a.asm.Uo).apply(null,arguments)},ir=a._emscripten_bind_b2MouseJointDef_set_maxForce_1=function(){return(ir=a._emscripten_bind_b2MouseJointDef_set_maxForce_1=a.asm.Vo).apply(null,arguments)},jr=a._emscripten_bind_b2MouseJointDef_get_frequencyHz_0=function(){return(jr=a._emscripten_bind_b2MouseJointDef_get_frequencyHz_0=a.asm.Wo).apply(null,arguments)},
kr=a._emscripten_bind_b2MouseJointDef_set_frequencyHz_1=function(){return(kr=a._emscripten_bind_b2MouseJointDef_set_frequencyHz_1=a.asm.Xo).apply(null,arguments)},lr=a._emscripten_bind_b2MouseJointDef_get_dampingRatio_0=function(){return(lr=a._emscripten_bind_b2MouseJointDef_get_dampingRatio_0=a.asm.Yo).apply(null,arguments)},mr=a._emscripten_bind_b2MouseJointDef_set_dampingRatio_1=function(){return(mr=a._emscripten_bind_b2MouseJointDef_set_dampingRatio_1=a.asm.Zo).apply(null,arguments)},nr=a._emscripten_bind_b2MouseJointDef_get_type_0=
function(){return(nr=a._emscripten_bind_b2MouseJointDef_get_type_0=a.asm._o).apply(null,arguments)},or=a._emscripten_bind_b2MouseJointDef_set_type_1=function(){return(or=a._emscripten_bind_b2MouseJointDef_set_type_1=a.asm.$o).apply(null,arguments)},pr=a._emscripten_bind_b2MouseJointDef_get_userData_0=function(){return(pr=a._emscripten_bind_b2MouseJointDef_get_userData_0=a.asm.ap).apply(null,arguments)},qr=a._emscripten_bind_b2MouseJointDef_set_userData_1=function(){return(qr=a._emscripten_bind_b2MouseJointDef_set_userData_1=
a.asm.bp).apply(null,arguments)},rr=a._emscripten_bind_b2MouseJointDef_get_bodyA_0=function(){return(rr=a._emscripten_bind_b2MouseJointDef_get_bodyA_0=a.asm.cp).apply(null,arguments)},sr=a._emscripten_bind_b2MouseJointDef_set_bodyA_1=function(){return(sr=a._emscripten_bind_b2MouseJointDef_set_bodyA_1=a.asm.dp).apply(null,arguments)},tr=a._emscripten_bind_b2MouseJointDef_get_bodyB_0=function(){return(tr=a._emscripten_bind_b2MouseJointDef_get_bodyB_0=a.asm.ep).apply(null,arguments)},ur=a._emscripten_bind_b2MouseJointDef_set_bodyB_1=
function(){return(ur=a._emscripten_bind_b2MouseJointDef_set_bodyB_1=a.asm.fp).apply(null,arguments)},vr=a._emscripten_bind_b2MouseJointDef_get_collideConnected_0=function(){return(vr=a._emscripten_bind_b2MouseJointDef_get_collideConnected_0=a.asm.gp).apply(null,arguments)},wr=a._emscripten_bind_b2MouseJointDef_set_collideConnected_1=function(){return(wr=a._emscripten_bind_b2MouseJointDef_set_collideConnected_1=a.asm.hp).apply(null,arguments)},xr=a._emscripten_bind_b2MouseJointDef___destroy___0=function(){return(xr=
a._emscripten_bind_b2MouseJointDef___destroy___0=a.asm.ip).apply(null,arguments)},yr=a._emscripten_bind_b2Contact_GetManifold_0=function(){return(yr=a._emscripten_bind_b2Contact_GetManifold_0=a.asm.jp).apply(null,arguments)},zr=a._emscripten_bind_b2Contact_GetWorldManifold_1=function(){return(zr=a._emscripten_bind_b2Contact_GetWorldManifold_1=a.asm.kp).apply(null,arguments)},Ar=a._emscripten_bind_b2Contact_IsTouching_0=function(){return(Ar=a._emscripten_bind_b2Contact_IsTouching_0=a.asm.lp).apply(null,
arguments)},Br=a._emscripten_bind_b2Contact_SetEnabled_1=function(){return(Br=a._emscripten_bind_b2Contact_SetEnabled_1=a.asm.mp).apply(null,arguments)},Cr=a._emscripten_bind_b2Contact_IsEnabled_0=function(){return(Cr=a._emscripten_bind_b2Contact_IsEnabled_0=a.asm.np).apply(null,arguments)},Dr=a._emscripten_bind_b2Contact_GetNext_0=function(){return(Dr=a._emscripten_bind_b2Contact_GetNext_0=a.asm.op).apply(null,arguments)},Er=a._emscripten_bind_b2Contact_GetFixtureA_0=function(){return(Er=a._emscripten_bind_b2Contact_GetFixtureA_0=
a.asm.pp).apply(null,arguments)},Fr=a._emscripten_bind_b2Contact_GetChildIndexA_0=function(){return(Fr=a._emscripten_bind_b2Contact_GetChildIndexA_0=a.asm.qp).apply(null,arguments)},Gr=a._emscripten_bind_b2Contact_GetFixtureB_0=function(){return(Gr=a._emscripten_bind_b2Contact_GetFixtureB_0=a.asm.rp).apply(null,arguments)},Hr=a._emscripten_bind_b2Contact_GetChildIndexB_0=function(){return(Hr=a._emscripten_bind_b2Contact_GetChildIndexB_0=a.asm.sp).apply(null,arguments)},Ir=a._emscripten_bind_b2Contact_SetFriction_1=
function(){return(Ir=a._emscripten_bind_b2Contact_SetFriction_1=a.asm.tp).apply(null,arguments)},Jr=a._emscripten_bind_b2Contact_GetFriction_0=function(){return(Jr=a._emscripten_bind_b2Contact_GetFriction_0=a.asm.up).apply(null,arguments)},Kr=a._emscripten_bind_b2Contact_ResetFriction_0=function(){return(Kr=a._emscripten_bind_b2Contact_ResetFriction_0=a.asm.vp).apply(null,arguments)},Lr=a._emscripten_bind_b2Contact_SetRestitution_1=function(){return(Lr=a._emscripten_bind_b2Contact_SetRestitution_1=
a.asm.wp).apply(null,arguments)},Mr=a._emscripten_bind_b2Contact_GetRestitution_0=function(){return(Mr=a._emscripten_bind_b2Contact_GetRestitution_0=a.asm.xp).apply(null,arguments)},Nr=a._emscripten_bind_b2Contact_ResetRestitution_0=function(){return(Nr=a._emscripten_bind_b2Contact_ResetRestitution_0=a.asm.yp).apply(null,arguments)},Or=a._emscripten_bind_b2Contact_SetTangentSpeed_1=function(){return(Or=a._emscripten_bind_b2Contact_SetTangentSpeed_1=a.asm.zp).apply(null,arguments)},Pr=a._emscripten_bind_b2Contact_GetTangentSpeed_0=
function(){return(Pr=a._emscripten_bind_b2Contact_GetTangentSpeed_0=a.asm.Ap).apply(null,arguments)},Qr=a._emscripten_bind_b2DistanceJointDef_b2DistanceJointDef_0=function(){return(Qr=a._emscripten_bind_b2DistanceJointDef_b2DistanceJointDef_0=a.asm.Bp).apply(null,arguments)},Rr=a._emscripten_bind_b2DistanceJointDef_Initialize_4=function(){return(Rr=a._emscripten_bind_b2DistanceJointDef_Initialize_4=a.asm.Cp).apply(null,arguments)},Sr=a._emscripten_bind_b2DistanceJointDef_get_localAnchorA_0=function(){return(Sr=
a._emscripten_bind_b2DistanceJointDef_get_localAnchorA_0=a.asm.Dp).apply(null,arguments)},Tr=a._emscripten_bind_b2DistanceJointDef_set_localAnchorA_1=function(){return(Tr=a._emscripten_bind_b2DistanceJointDef_set_localAnchorA_1=a.asm.Ep).apply(null,arguments)},Ur=a._emscripten_bind_b2DistanceJointDef_get_localAnchorB_0=function(){return(Ur=a._emscripten_bind_b2DistanceJointDef_get_localAnchorB_0=a.asm.Fp).apply(null,arguments)},Vr=a._emscripten_bind_b2DistanceJointDef_set_localAnchorB_1=function(){return(Vr=
a._emscripten_bind_b2DistanceJointDef_set_localAnchorB_1=a.asm.Gp).apply(null,arguments)},Wr=a._emscripten_bind_b2DistanceJointDef_get_length_0=function(){return(Wr=a._emscripten_bind_b2DistanceJointDef_get_length_0=a.asm.Hp).apply(null,arguments)},Xr=a._emscripten_bind_b2DistanceJointDef_set_length_1=function(){return(Xr=a._emscripten_bind_b2DistanceJointDef_set_length_1=a.asm.Ip).apply(null,arguments)},Yr=a._emscripten_bind_b2DistanceJointDef_get_frequencyHz_0=function(){return(Yr=a._emscripten_bind_b2DistanceJointDef_get_frequencyHz_0=
a.asm.Jp).apply(null,arguments)},Zr=a._emscripten_bind_b2DistanceJointDef_set_frequencyHz_1=function(){return(Zr=a._emscripten_bind_b2DistanceJointDef_set_frequencyHz_1=a.asm.Kp).apply(null,arguments)},$r=a._emscripten_bind_b2DistanceJointDef_get_dampingRatio_0=function(){return($r=a._emscripten_bind_b2DistanceJointDef_get_dampingRatio_0=a.asm.Lp).apply(null,arguments)},as=a._emscripten_bind_b2DistanceJointDef_set_dampingRatio_1=function(){return(as=a._emscripten_bind_b2DistanceJointDef_set_dampingRatio_1=
a.asm.Mp).apply(null,arguments)},bs=a._emscripten_bind_b2DistanceJointDef_get_type_0=function(){return(bs=a._emscripten_bind_b2DistanceJointDef_get_type_0=a.asm.Np).apply(null,arguments)},cs=a._emscripten_bind_b2DistanceJointDef_set_type_1=function(){return(cs=a._emscripten_bind_b2DistanceJointDef_set_type_1=a.asm.Op).apply(null,arguments)},ds=a._emscripten_bind_b2DistanceJointDef_get_userData_0=function(){return(ds=a._emscripten_bind_b2DistanceJointDef_get_userData_0=a.asm.Pp).apply(null,arguments)},
es=a._emscripten_bind_b2DistanceJointDef_set_userData_1=function(){return(es=a._emscripten_bind_b2DistanceJointDef_set_userData_1=a.asm.Qp).apply(null,arguments)},gs=a._emscripten_bind_b2DistanceJointDef_get_bodyA_0=function(){return(gs=a._emscripten_bind_b2DistanceJointDef_get_bodyA_0=a.asm.Rp).apply(null,arguments)},hs=a._emscripten_bind_b2DistanceJointDef_set_bodyA_1=function(){return(hs=a._emscripten_bind_b2DistanceJointDef_set_bodyA_1=a.asm.Sp).apply(null,arguments)},is=a._emscripten_bind_b2DistanceJointDef_get_bodyB_0=
function(){return(is=a._emscripten_bind_b2DistanceJointDef_get_bodyB_0=a.asm.Tp).apply(null,arguments)},js=a._emscripten_bind_b2DistanceJointDef_set_bodyB_1=function(){return(js=a._emscripten_bind_b2DistanceJointDef_set_bodyB_1=a.asm.Up).apply(null,arguments)},ks=a._emscripten_bind_b2DistanceJointDef_get_collideConnected_0=function(){return(ks=a._emscripten_bind_b2DistanceJointDef_get_collideConnected_0=a.asm.Vp).apply(null,arguments)},ls=a._emscripten_bind_b2DistanceJointDef_set_collideConnected_1=
function(){return(ls=a._emscripten_bind_b2DistanceJointDef_set_collideConnected_1=a.asm.Wp).apply(null,arguments)},ms=a._emscripten_bind_b2DistanceJointDef___destroy___0=function(){return(ms=a._emscripten_bind_b2DistanceJointDef___destroy___0=a.asm.Xp).apply(null,arguments)},ns=a._emscripten_bind_b2Body_CreateFixture_1=function(){return(ns=a._emscripten_bind_b2Body_CreateFixture_1=a.asm.Yp).apply(null,arguments)},ps=a._emscripten_bind_b2Body_CreateFixture_2=function(){return(ps=a._emscripten_bind_b2Body_CreateFixture_2=
a.asm.Zp).apply(null,arguments)},qs=a._emscripten_bind_b2Body_DestroyFixture_1=function(){return(qs=a._emscripten_bind_b2Body_DestroyFixture_1=a.asm._p).apply(null,arguments)},rs=a._emscripten_bind_b2Body_SetTransform_2=function(){return(rs=a._emscripten_bind_b2Body_SetTransform_2=a.asm.$p).apply(null,arguments)},ss=a._emscripten_bind_b2Body_GetTransform_0=function(){return(ss=a._emscripten_bind_b2Body_GetTransform_0=a.asm.aq).apply(null,arguments)},ts=a._emscripten_bind_b2Body_GetPosition_0=function(){return(ts=
a._emscripten_bind_b2Body_GetPosition_0=a.asm.bq).apply(null,arguments)},us=a._emscripten_bind_b2Body_GetAngle_0=function(){return(us=a._emscripten_bind_b2Body_GetAngle_0=a.asm.cq).apply(null,arguments)},vs=a._emscripten_bind_b2Body_GetWorldCenter_0=function(){return(vs=a._emscripten_bind_b2Body_GetWorldCenter_0=a.asm.dq).apply(null,arguments)},xs=a._emscripten_bind_b2Body_GetLocalCenter_0=function(){return(xs=a._emscripten_bind_b2Body_GetLocalCenter_0=a.asm.eq).apply(null,arguments)},ys=a._emscripten_bind_b2Body_SetLinearVelocity_1=
function(){return(ys=a._emscripten_bind_b2Body_SetLinearVelocity_1=a.asm.fq).apply(null,arguments)},zs=a._emscripten_bind_b2Body_GetLinearVelocity_0=function(){return(zs=a._emscripten_bind_b2Body_GetLinearVelocity_0=a.asm.gq).apply(null,arguments)},As=a._emscripten_bind_b2Body_SetAngularVelocity_1=function(){return(As=a._emscripten_bind_b2Body_SetAngularVelocity_1=a.asm.hq).apply(null,arguments)},Bs=a._emscripten_bind_b2Body_GetAngularVelocity_0=function(){return(Bs=a._emscripten_bind_b2Body_GetAngularVelocity_0=
a.asm.iq).apply(null,arguments)},Cs=a._emscripten_bind_b2Body_ApplyForce_3=function(){return(Cs=a._emscripten_bind_b2Body_ApplyForce_3=a.asm.jq).apply(null,arguments)},Ds=a._emscripten_bind_b2Body_ApplyForceToCenter_2=function(){return(Ds=a._emscripten_bind_b2Body_ApplyForceToCenter_2=a.asm.kq).apply(null,arguments)},Es=a._emscripten_bind_b2Body_ApplyTorque_2=function(){return(Es=a._emscripten_bind_b2Body_ApplyTorque_2=a.asm.lq).apply(null,arguments)},Fs=a._emscripten_bind_b2Body_ApplyLinearImpulse_3=
function(){return(Fs=a._emscripten_bind_b2Body_ApplyLinearImpulse_3=a.asm.mq).apply(null,arguments)},Gs=a._emscripten_bind_b2Body_ApplyAngularImpulse_2=function(){return(Gs=a._emscripten_bind_b2Body_ApplyAngularImpulse_2=a.asm.nq).apply(null,arguments)},Hs=a._emscripten_bind_b2Body_GetMass_0=function(){return(Hs=a._emscripten_bind_b2Body_GetMass_0=a.asm.oq).apply(null,arguments)},Is=a._emscripten_bind_b2Body_GetInertia_0=function(){return(Is=a._emscripten_bind_b2Body_GetInertia_0=a.asm.pq).apply(null,
arguments)},Js=a._emscripten_bind_b2Body_GetMassData_1=function(){return(Js=a._emscripten_bind_b2Body_GetMassData_1=a.asm.qq).apply(null,arguments)},Ks=a._emscripten_bind_b2Body_SetMassData_1=function(){return(Ks=a._emscripten_bind_b2Body_SetMassData_1=a.asm.rq).apply(null,arguments)},Ls=a._emscripten_bind_b2Body_ResetMassData_0=function(){return(Ls=a._emscripten_bind_b2Body_ResetMassData_0=a.asm.sq).apply(null,arguments)},Ms=a._emscripten_bind_b2Body_GetWorldPoint_1=function(){return(Ms=a._emscripten_bind_b2Body_GetWorldPoint_1=
a.asm.tq).apply(null,arguments)},Ns=a._emscripten_bind_b2Body_GetWorldVector_1=function(){return(Ns=a._emscripten_bind_b2Body_GetWorldVector_1=a.asm.uq).apply(null,arguments)},Os=a._emscripten_bind_b2Body_GetLocalPoint_1=function(){return(Os=a._emscripten_bind_b2Body_GetLocalPoint_1=a.asm.vq).apply(null,arguments)},Ps=a._emscripten_bind_b2Body_GetLocalVector_1=function(){return(Ps=a._emscripten_bind_b2Body_GetLocalVector_1=a.asm.wq).apply(null,arguments)},Qs=a._emscripten_bind_b2Body_GetLinearVelocityFromWorldPoint_1=
function(){return(Qs=a._emscripten_bind_b2Body_GetLinearVelocityFromWorldPoint_1=a.asm.xq).apply(null,arguments)},Rs=a._emscripten_bind_b2Body_GetLinearVelocityFromLocalPoint_1=function(){return(Rs=a._emscripten_bind_b2Body_GetLinearVelocityFromLocalPoint_1=a.asm.yq).apply(null,arguments)},Ss=a._emscripten_bind_b2Body_GetLinearDamping_0=function(){return(Ss=a._emscripten_bind_b2Body_GetLinearDamping_0=a.asm.zq).apply(null,arguments)},Ts=a._emscripten_bind_b2Body_SetLinearDamping_1=function(){return(Ts=
a._emscripten_bind_b2Body_SetLinearDamping_1=a.asm.Aq).apply(null,arguments)},Us=a._emscripten_bind_b2Body_GetAngularDamping_0=function(){return(Us=a._emscripten_bind_b2Body_GetAngularDamping_0=a.asm.Bq).apply(null,arguments)},Vs=a._emscripten_bind_b2Body_SetAngularDamping_1=function(){return(Vs=a._emscripten_bind_b2Body_SetAngularDamping_1=a.asm.Cq).apply(null,arguments)},Ws=a._emscripten_bind_b2Body_GetGravityScale_0=function(){return(Ws=a._emscripten_bind_b2Body_GetGravityScale_0=a.asm.Dq).apply(null,
arguments)},Xs=a._emscripten_bind_b2Body_SetGravityScale_1=function(){return(Xs=a._emscripten_bind_b2Body_SetGravityScale_1=a.asm.Eq).apply(null,arguments)},Ys=a._emscripten_bind_b2Body_SetType_1=function(){return(Ys=a._emscripten_bind_b2Body_SetType_1=a.asm.Fq).apply(null,arguments)},Zs=a._emscripten_bind_b2Body_GetType_0=function(){return(Zs=a._emscripten_bind_b2Body_GetType_0=a.asm.Gq).apply(null,arguments)},$s=a._emscripten_bind_b2Body_SetBullet_1=function(){return($s=a._emscripten_bind_b2Body_SetBullet_1=
a.asm.Hq).apply(null,arguments)},at=a._emscripten_bind_b2Body_IsBullet_0=function(){return(at=a._emscripten_bind_b2Body_IsBullet_0=a.asm.Iq).apply(null,arguments)},bt=a._emscripten_bind_b2Body_SetSleepingAllowed_1=function(){return(bt=a._emscripten_bind_b2Body_SetSleepingAllowed_1=a.asm.Jq).apply(null,arguments)},ct=a._emscripten_bind_b2Body_IsSleepingAllowed_0=function(){return(ct=a._emscripten_bind_b2Body_IsSleepingAllowed_0=a.asm.Kq).apply(null,arguments)},dt=a._emscripten_bind_b2Body_SetAwake_1=
function(){return(dt=a._emscripten_bind_b2Body_SetAwake_1=a.asm.Lq).apply(null,arguments)},et=a._emscripten_bind_b2Body_IsAwake_0=function(){return(et=a._emscripten_bind_b2Body_IsAwake_0=a.asm.Mq).apply(null,arguments)},ft=a._emscripten_bind_b2Body_SetActive_1=function(){return(ft=a._emscripten_bind_b2Body_SetActive_1=a.asm.Nq).apply(null,arguments)},gt=a._emscripten_bind_b2Body_IsActive_0=function(){return(gt=a._emscripten_bind_b2Body_IsActive_0=a.asm.Oq).apply(null,arguments)},ht=a._emscripten_bind_b2Body_SetFixedRotation_1=
function(){return(ht=a._emscripten_bind_b2Body_SetFixedRotation_1=a.asm.Pq).apply(null,arguments)},it=a._emscripten_bind_b2Body_IsFixedRotation_0=function(){return(it=a._emscripten_bind_b2Body_IsFixedRotation_0=a.asm.Qq).apply(null,arguments)},jt=a._emscripten_bind_b2Body_GetFixtureList_0=function(){return(jt=a._emscripten_bind_b2Body_GetFixtureList_0=a.asm.Rq).apply(null,arguments)},kt=a._emscripten_bind_b2Body_GetJointList_0=function(){return(kt=a._emscripten_bind_b2Body_GetJointList_0=a.asm.Sq).apply(null,
arguments)},lt=a._emscripten_bind_b2Body_GetContactList_0=function(){return(lt=a._emscripten_bind_b2Body_GetContactList_0=a.asm.Tq).apply(null,arguments)},mt=a._emscripten_bind_b2Body_GetNext_0=function(){return(mt=a._emscripten_bind_b2Body_GetNext_0=a.asm.Uq).apply(null,arguments)},nt=a._emscripten_bind_b2Body_GetUserData_0=function(){return(nt=a._emscripten_bind_b2Body_GetUserData_0=a.asm.Vq).apply(null,arguments)},ot=a._emscripten_bind_b2Body_SetUserData_1=function(){return(ot=a._emscripten_bind_b2Body_SetUserData_1=
a.asm.Wq).apply(null,arguments)},pt=a._emscripten_bind_b2Body_GetWorld_0=function(){return(pt=a._emscripten_bind_b2Body_GetWorld_0=a.asm.Xq).apply(null,arguments)},qt=a._emscripten_bind_b2Body_Dump_0=function(){return(qt=a._emscripten_bind_b2Body_Dump_0=a.asm.Yq).apply(null,arguments)},rt=a._emscripten_bind_b2FrictionJoint_GetLocalAnchorA_0=function(){return(rt=a._emscripten_bind_b2FrictionJoint_GetLocalAnchorA_0=a.asm.Zq).apply(null,arguments)},st=a._emscripten_bind_b2FrictionJoint_GetLocalAnchorB_0=
function(){return(st=a._emscripten_bind_b2FrictionJoint_GetLocalAnchorB_0=a.asm._q).apply(null,arguments)},tt=a._emscripten_bind_b2FrictionJoint_SetMaxForce_1=function(){return(tt=a._emscripten_bind_b2FrictionJoint_SetMaxForce_1=a.asm.$q).apply(null,arguments)},ut=a._emscripten_bind_b2FrictionJoint_GetMaxForce_0=function(){return(ut=a._emscripten_bind_b2FrictionJoint_GetMaxForce_0=a.asm.ar).apply(null,arguments)},vt=a._emscripten_bind_b2FrictionJoint_SetMaxTorque_1=function(){return(vt=a._emscripten_bind_b2FrictionJoint_SetMaxTorque_1=
a.asm.br).apply(null,arguments)},wt=a._emscripten_bind_b2FrictionJoint_GetMaxTorque_0=function(){return(wt=a._emscripten_bind_b2FrictionJoint_GetMaxTorque_0=a.asm.cr).apply(null,arguments)},xt=a._emscripten_bind_b2FrictionJoint_GetType_0=function(){return(xt=a._emscripten_bind_b2FrictionJoint_GetType_0=a.asm.dr).apply(null,arguments)},yt=a._emscripten_bind_b2FrictionJoint_GetBodyA_0=function(){return(yt=a._emscripten_bind_b2FrictionJoint_GetBodyA_0=a.asm.er).apply(null,arguments)},zt=a._emscripten_bind_b2FrictionJoint_GetBodyB_0=
function(){return(zt=a._emscripten_bind_b2FrictionJoint_GetBodyB_0=a.asm.fr).apply(null,arguments)},At=a._emscripten_bind_b2FrictionJoint_GetAnchorA_0=function(){return(At=a._emscripten_bind_b2FrictionJoint_GetAnchorA_0=a.asm.gr).apply(null,arguments)},Bt=a._emscripten_bind_b2FrictionJoint_GetAnchorB_0=function(){return(Bt=a._emscripten_bind_b2FrictionJoint_GetAnchorB_0=a.asm.hr).apply(null,arguments)},Ct=a._emscripten_bind_b2FrictionJoint_GetReactionForce_1=function(){return(Ct=a._emscripten_bind_b2FrictionJoint_GetReactionForce_1=
a.asm.ir).apply(null,arguments)},Dt=a._emscripten_bind_b2FrictionJoint_GetReactionTorque_1=function(){return(Dt=a._emscripten_bind_b2FrictionJoint_GetReactionTorque_1=a.asm.jr).apply(null,arguments)},Et=a._emscripten_bind_b2FrictionJoint_GetNext_0=function(){return(Et=a._emscripten_bind_b2FrictionJoint_GetNext_0=a.asm.kr).apply(null,arguments)},Ft=a._emscripten_bind_b2FrictionJoint_GetUserData_0=function(){return(Ft=a._emscripten_bind_b2FrictionJoint_GetUserData_0=a.asm.lr).apply(null,arguments)},
Gt=a._emscripten_bind_b2FrictionJoint_SetUserData_1=function(){return(Gt=a._emscripten_bind_b2FrictionJoint_SetUserData_1=a.asm.mr).apply(null,arguments)},Ht=a._emscripten_bind_b2FrictionJoint_IsActive_0=function(){return(Ht=a._emscripten_bind_b2FrictionJoint_IsActive_0=a.asm.nr).apply(null,arguments)},It=a._emscripten_bind_b2FrictionJoint_GetCollideConnected_0=function(){return(It=a._emscripten_bind_b2FrictionJoint_GetCollideConnected_0=a.asm.or).apply(null,arguments)},Jt=a._emscripten_bind_b2FrictionJoint___destroy___0=
function(){return(Jt=a._emscripten_bind_b2FrictionJoint___destroy___0=a.asm.pr).apply(null,arguments)},Kt=a._emscripten_bind_b2DestructionListener___destroy___0=function(){return(Kt=a._emscripten_bind_b2DestructionListener___destroy___0=a.asm.qr).apply(null,arguments)},Lt=a._emscripten_bind_b2GearJointDef_b2GearJointDef_0=function(){return(Lt=a._emscripten_bind_b2GearJointDef_b2GearJointDef_0=a.asm.rr).apply(null,arguments)},Mt=a._emscripten_bind_b2GearJointDef_get_joint1_0=function(){return(Mt=a._emscripten_bind_b2GearJointDef_get_joint1_0=
a.asm.sr).apply(null,arguments)},Nt=a._emscripten_bind_b2GearJointDef_set_joint1_1=function(){return(Nt=a._emscripten_bind_b2GearJointDef_set_joint1_1=a.asm.tr).apply(null,arguments)},Ot=a._emscripten_bind_b2GearJointDef_get_joint2_0=function(){return(Ot=a._emscripten_bind_b2GearJointDef_get_joint2_0=a.asm.ur).apply(null,arguments)},Pt=a._emscripten_bind_b2GearJointDef_set_joint2_1=function(){return(Pt=a._emscripten_bind_b2GearJointDef_set_joint2_1=a.asm.vr).apply(null,arguments)},Qt=a._emscripten_bind_b2GearJointDef_get_ratio_0=
function(){return(Qt=a._emscripten_bind_b2GearJointDef_get_ratio_0=a.asm.wr).apply(null,arguments)},Rt=a._emscripten_bind_b2GearJointDef_set_ratio_1=function(){return(Rt=a._emscripten_bind_b2GearJointDef_set_ratio_1=a.asm.xr).apply(null,arguments)},St=a._emscripten_bind_b2GearJointDef_get_type_0=function(){return(St=a._emscripten_bind_b2GearJointDef_get_type_0=a.asm.yr).apply(null,arguments)},Tt=a._emscripten_bind_b2GearJointDef_set_type_1=function(){return(Tt=a._emscripten_bind_b2GearJointDef_set_type_1=
a.asm.zr).apply(null,arguments)},Ut=a._emscripten_bind_b2GearJointDef_get_userData_0=function(){return(Ut=a._emscripten_bind_b2GearJointDef_get_userData_0=a.asm.Ar).apply(null,arguments)},Vt=a._emscripten_bind_b2GearJointDef_set_userData_1=function(){return(Vt=a._emscripten_bind_b2GearJointDef_set_userData_1=a.asm.Br).apply(null,arguments)},Wt=a._emscripten_bind_b2GearJointDef_get_bodyA_0=function(){return(Wt=a._emscripten_bind_b2GearJointDef_get_bodyA_0=a.asm.Cr).apply(null,arguments)},Xt=a._emscripten_bind_b2GearJointDef_set_bodyA_1=
function(){return(Xt=a._emscripten_bind_b2GearJointDef_set_bodyA_1=a.asm.Dr).apply(null,arguments)},Yt=a._emscripten_bind_b2GearJointDef_get_bodyB_0=function(){return(Yt=a._emscripten_bind_b2GearJointDef_get_bodyB_0=a.asm.Er).apply(null,arguments)},Zt=a._emscripten_bind_b2GearJointDef_set_bodyB_1=function(){return(Zt=a._emscripten_bind_b2GearJointDef_set_bodyB_1=a.asm.Fr).apply(null,arguments)},$t=a._emscripten_bind_b2GearJointDef_get_collideConnected_0=function(){return($t=a._emscripten_bind_b2GearJointDef_get_collideConnected_0=
a.asm.Gr).apply(null,arguments)},au=a._emscripten_bind_b2GearJointDef_set_collideConnected_1=function(){return(au=a._emscripten_bind_b2GearJointDef_set_collideConnected_1=a.asm.Hr).apply(null,arguments)},bu=a._emscripten_bind_b2GearJointDef___destroy___0=function(){return(bu=a._emscripten_bind_b2GearJointDef___destroy___0=a.asm.Ir).apply(null,arguments)},cu=a._emscripten_bind_b2RevoluteJoint_GetLocalAnchorA_0=function(){return(cu=a._emscripten_bind_b2RevoluteJoint_GetLocalAnchorA_0=a.asm.Jr).apply(null,
arguments)},du=a._emscripten_bind_b2RevoluteJoint_GetLocalAnchorB_0=function(){return(du=a._emscripten_bind_b2RevoluteJoint_GetLocalAnchorB_0=a.asm.Kr).apply(null,arguments)},eu=a._emscripten_bind_b2RevoluteJoint_GetReferenceAngle_0=function(){return(eu=a._emscripten_bind_b2RevoluteJoint_GetReferenceAngle_0=a.asm.Lr).apply(null,arguments)},fu=a._emscripten_bind_b2RevoluteJoint_GetJointAngle_0=function(){return(fu=a._emscripten_bind_b2RevoluteJoint_GetJointAngle_0=a.asm.Mr).apply(null,arguments)},
gu=a._emscripten_bind_b2RevoluteJoint_GetJointSpeed_0=function(){return(gu=a._emscripten_bind_b2RevoluteJoint_GetJointSpeed_0=a.asm.Nr).apply(null,arguments)},hu=a._emscripten_bind_b2RevoluteJoint_IsLimitEnabled_0=function(){return(hu=a._emscripten_bind_b2RevoluteJoint_IsLimitEnabled_0=a.asm.Or).apply(null,arguments)},iu=a._emscripten_bind_b2RevoluteJoint_EnableLimit_1=function(){return(iu=a._emscripten_bind_b2RevoluteJoint_EnableLimit_1=a.asm.Pr).apply(null,arguments)},ju=a._emscripten_bind_b2RevoluteJoint_GetLowerLimit_0=
function(){return(ju=a._emscripten_bind_b2RevoluteJoint_GetLowerLimit_0=a.asm.Qr).apply(null,arguments)},ku=a._emscripten_bind_b2RevoluteJoint_GetUpperLimit_0=function(){return(ku=a._emscripten_bind_b2RevoluteJoint_GetUpperLimit_0=a.asm.Rr).apply(null,arguments)},lu=a._emscripten_bind_b2RevoluteJoint_SetLimits_2=function(){return(lu=a._emscripten_bind_b2RevoluteJoint_SetLimits_2=a.asm.Sr).apply(null,arguments)},mu=a._emscripten_bind_b2RevoluteJoint_IsMotorEnabled_0=function(){return(mu=a._emscripten_bind_b2RevoluteJoint_IsMotorEnabled_0=
a.asm.Tr).apply(null,arguments)},nu=a._emscripten_bind_b2RevoluteJoint_EnableMotor_1=function(){return(nu=a._emscripten_bind_b2RevoluteJoint_EnableMotor_1=a.asm.Ur).apply(null,arguments)},ou=a._emscripten_bind_b2RevoluteJoint_SetMotorSpeed_1=function(){return(ou=a._emscripten_bind_b2RevoluteJoint_SetMotorSpeed_1=a.asm.Vr).apply(null,arguments)},pu=a._emscripten_bind_b2RevoluteJoint_GetMotorSpeed_0=function(){return(pu=a._emscripten_bind_b2RevoluteJoint_GetMotorSpeed_0=a.asm.Wr).apply(null,arguments)},
qu=a._emscripten_bind_b2RevoluteJoint_SetMaxMotorTorque_1=function(){return(qu=a._emscripten_bind_b2RevoluteJoint_SetMaxMotorTorque_1=a.asm.Xr).apply(null,arguments)},ru=a._emscripten_bind_b2RevoluteJoint_GetMaxMotorTorque_0=function(){return(ru=a._emscripten_bind_b2RevoluteJoint_GetMaxMotorTorque_0=a.asm.Yr).apply(null,arguments)},su=a._emscripten_bind_b2RevoluteJoint_GetMotorTorque_1=function(){return(su=a._emscripten_bind_b2RevoluteJoint_GetMotorTorque_1=a.asm.Zr).apply(null,arguments)},tu=a._emscripten_bind_b2RevoluteJoint_GetType_0=
function(){return(tu=a._emscripten_bind_b2RevoluteJoint_GetType_0=a.asm._r).apply(null,arguments)},uu=a._emscripten_bind_b2RevoluteJoint_GetBodyA_0=function(){return(uu=a._emscripten_bind_b2RevoluteJoint_GetBodyA_0=a.asm.$r).apply(null,arguments)},vu=a._emscripten_bind_b2RevoluteJoint_GetBodyB_0=function(){return(vu=a._emscripten_bind_b2RevoluteJoint_GetBodyB_0=a.asm.as).apply(null,arguments)},wu=a._emscripten_bind_b2RevoluteJoint_GetAnchorA_0=function(){return(wu=a._emscripten_bind_b2RevoluteJoint_GetAnchorA_0=
a.asm.bs).apply(null,arguments)},xu=a._emscripten_bind_b2RevoluteJoint_GetAnchorB_0=function(){return(xu=a._emscripten_bind_b2RevoluteJoint_GetAnchorB_0=a.asm.cs).apply(null,arguments)},yu=a._emscripten_bind_b2RevoluteJoint_GetReactionForce_1=function(){return(yu=a._emscripten_bind_b2RevoluteJoint_GetReactionForce_1=a.asm.ds).apply(null,arguments)},zu=a._emscripten_bind_b2RevoluteJoint_GetReactionTorque_1=function(){return(zu=a._emscripten_bind_b2RevoluteJoint_GetReactionTorque_1=a.asm.es).apply(null,
arguments)},Au=a._emscripten_bind_b2RevoluteJoint_GetNext_0=function(){return(Au=a._emscripten_bind_b2RevoluteJoint_GetNext_0=a.asm.fs).apply(null,arguments)},Bu=a._emscripten_bind_b2RevoluteJoint_GetUserData_0=function(){return(Bu=a._emscripten_bind_b2RevoluteJoint_GetUserData_0=a.asm.gs).apply(null,arguments)},Cu=a._emscripten_bind_b2RevoluteJoint_SetUserData_1=function(){return(Cu=a._emscripten_bind_b2RevoluteJoint_SetUserData_1=a.asm.hs).apply(null,arguments)},Du=a._emscripten_bind_b2RevoluteJoint_IsActive_0=
function(){return(Du=a._emscripten_bind_b2RevoluteJoint_IsActive_0=a.asm.is).apply(null,arguments)},Eu=a._emscripten_bind_b2RevoluteJoint_GetCollideConnected_0=function(){return(Eu=a._emscripten_bind_b2RevoluteJoint_GetCollideConnected_0=a.asm.js).apply(null,arguments)},Fu=a._emscripten_bind_b2RevoluteJoint___destroy___0=function(){return(Fu=a._emscripten_bind_b2RevoluteJoint___destroy___0=a.asm.ks).apply(null,arguments)},Gu=a._emscripten_bind_b2ContactEdge_b2ContactEdge_0=function(){return(Gu=a._emscripten_bind_b2ContactEdge_b2ContactEdge_0=
a.asm.ls).apply(null,arguments)},Hu=a._emscripten_bind_b2ContactEdge_get_other_0=function(){return(Hu=a._emscripten_bind_b2ContactEdge_get_other_0=a.asm.ms).apply(null,arguments)},Iu=a._emscripten_bind_b2ContactEdge_set_other_1=function(){return(Iu=a._emscripten_bind_b2ContactEdge_set_other_1=a.asm.ns).apply(null,arguments)},Ju=a._emscripten_bind_b2ContactEdge_get_contact_0=function(){return(Ju=a._emscripten_bind_b2ContactEdge_get_contact_0=a.asm.os).apply(null,arguments)},Ku=a._emscripten_bind_b2ContactEdge_set_contact_1=
function(){return(Ku=a._emscripten_bind_b2ContactEdge_set_contact_1=a.asm.ps).apply(null,arguments)},Lu=a._emscripten_bind_b2ContactEdge_get_prev_0=function(){return(Lu=a._emscripten_bind_b2ContactEdge_get_prev_0=a.asm.qs).apply(null,arguments)},Mu=a._emscripten_bind_b2ContactEdge_set_prev_1=function(){return(Mu=a._emscripten_bind_b2ContactEdge_set_prev_1=a.asm.rs).apply(null,arguments)},Nu=a._emscripten_bind_b2ContactEdge_get_next_0=function(){return(Nu=a._emscripten_bind_b2ContactEdge_get_next_0=
a.asm.ss).apply(null,arguments)},Ou=a._emscripten_bind_b2ContactEdge_set_next_1=function(){return(Ou=a._emscripten_bind_b2ContactEdge_set_next_1=a.asm.ts).apply(null,arguments)},Pu=a._emscripten_bind_b2ContactEdge___destroy___0=function(){return(Pu=a._emscripten_bind_b2ContactEdge___destroy___0=a.asm.us).apply(null,arguments)},Qu=a._emscripten_bind_b2RopeJointDef_b2RopeJointDef_0=function(){return(Qu=a._emscripten_bind_b2RopeJointDef_b2RopeJointDef_0=a.asm.vs).apply(null,arguments)},Ru=a._emscripten_bind_b2RopeJointDef_get_localAnchorA_0=
function(){return(Ru=a._emscripten_bind_b2RopeJointDef_get_localAnchorA_0=a.asm.ws).apply(null,arguments)},Su=a._emscripten_bind_b2RopeJointDef_set_localAnchorA_1=function(){return(Su=a._emscripten_bind_b2RopeJointDef_set_localAnchorA_1=a.asm.xs).apply(null,arguments)},Tu=a._emscripten_bind_b2RopeJointDef_get_localAnchorB_0=function(){return(Tu=a._emscripten_bind_b2RopeJointDef_get_localAnchorB_0=a.asm.ys).apply(null,arguments)},Uu=a._emscripten_bind_b2RopeJointDef_set_localAnchorB_1=function(){return(Uu=
a._emscripten_bind_b2RopeJointDef_set_localAnchorB_1=a.asm.zs).apply(null,arguments)},Vu=a._emscripten_bind_b2RopeJointDef_get_maxLength_0=function(){return(Vu=a._emscripten_bind_b2RopeJointDef_get_maxLength_0=a.asm.As).apply(null,arguments)},Wu=a._emscripten_bind_b2RopeJointDef_set_maxLength_1=function(){return(Wu=a._emscripten_bind_b2RopeJointDef_set_maxLength_1=a.asm.Bs).apply(null,arguments)},Xu=a._emscripten_bind_b2RopeJointDef_get_type_0=function(){return(Xu=a._emscripten_bind_b2RopeJointDef_get_type_0=
a.asm.Cs).apply(null,arguments)},Yu=a._emscripten_bind_b2RopeJointDef_set_type_1=function(){return(Yu=a._emscripten_bind_b2RopeJointDef_set_type_1=a.asm.Ds).apply(null,arguments)},Zu=a._emscripten_bind_b2RopeJointDef_get_userData_0=function(){return(Zu=a._emscripten_bind_b2RopeJointDef_get_userData_0=a.asm.Es).apply(null,arguments)},$u=a._emscripten_bind_b2RopeJointDef_set_userData_1=function(){return($u=a._emscripten_bind_b2RopeJointDef_set_userData_1=a.asm.Fs).apply(null,arguments)},av=a._emscripten_bind_b2RopeJointDef_get_bodyA_0=
function(){return(av=a._emscripten_bind_b2RopeJointDef_get_bodyA_0=a.asm.Gs).apply(null,arguments)},bv=a._emscripten_bind_b2RopeJointDef_set_bodyA_1=function(){return(bv=a._emscripten_bind_b2RopeJointDef_set_bodyA_1=a.asm.Hs).apply(null,arguments)},cv=a._emscripten_bind_b2RopeJointDef_get_bodyB_0=function(){return(cv=a._emscripten_bind_b2RopeJointDef_get_bodyB_0=a.asm.Is).apply(null,arguments)},dv=a._emscripten_bind_b2RopeJointDef_set_bodyB_1=function(){return(dv=a._emscripten_bind_b2RopeJointDef_set_bodyB_1=
a.asm.Js).apply(null,arguments)},ev=a._emscripten_bind_b2RopeJointDef_get_collideConnected_0=function(){return(ev=a._emscripten_bind_b2RopeJointDef_get_collideConnected_0=a.asm.Ks).apply(null,arguments)},fv=a._emscripten_bind_b2RopeJointDef_set_collideConnected_1=function(){return(fv=a._emscripten_bind_b2RopeJointDef_set_collideConnected_1=a.asm.Ls).apply(null,arguments)},gv=a._emscripten_bind_b2RopeJointDef___destroy___0=function(){return(gv=a._emscripten_bind_b2RopeJointDef___destroy___0=a.asm.Ms).apply(null,
arguments)},hv=a._emscripten_bind_b2MotorJointDef_b2MotorJointDef_0=function(){return(hv=a._emscripten_bind_b2MotorJointDef_b2MotorJointDef_0=a.asm.Ns).apply(null,arguments)},iv=a._emscripten_bind_b2MotorJointDef_Initialize_2=function(){return(iv=a._emscripten_bind_b2MotorJointDef_Initialize_2=a.asm.Os).apply(null,arguments)},jv=a._emscripten_bind_b2MotorJointDef_get_linearOffset_0=function(){return(jv=a._emscripten_bind_b2MotorJointDef_get_linearOffset_0=a.asm.Ps).apply(null,arguments)},kv=a._emscripten_bind_b2MotorJointDef_set_linearOffset_1=
function(){return(kv=a._emscripten_bind_b2MotorJointDef_set_linearOffset_1=a.asm.Qs).apply(null,arguments)},lv=a._emscripten_bind_b2MotorJointDef_get_angularOffset_0=function(){return(lv=a._emscripten_bind_b2MotorJointDef_get_angularOffset_0=a.asm.Rs).apply(null,arguments)},mv=a._emscripten_bind_b2MotorJointDef_set_angularOffset_1=function(){return(mv=a._emscripten_bind_b2MotorJointDef_set_angularOffset_1=a.asm.Ss).apply(null,arguments)},nv=a._emscripten_bind_b2MotorJointDef_get_maxForce_0=function(){return(nv=
a._emscripten_bind_b2MotorJointDef_get_maxForce_0=a.asm.Ts).apply(null,arguments)},ov=a._emscripten_bind_b2MotorJointDef_set_maxForce_1=function(){return(ov=a._emscripten_bind_b2MotorJointDef_set_maxForce_1=a.asm.Us).apply(null,arguments)},pv=a._emscripten_bind_b2MotorJointDef_get_maxTorque_0=function(){return(pv=a._emscripten_bind_b2MotorJointDef_get_maxTorque_0=a.asm.Vs).apply(null,arguments)},qv=a._emscripten_bind_b2MotorJointDef_set_maxTorque_1=function(){return(qv=a._emscripten_bind_b2MotorJointDef_set_maxTorque_1=
a.asm.Ws).apply(null,arguments)},rv=a._emscripten_bind_b2MotorJointDef_get_correctionFactor_0=function(){return(rv=a._emscripten_bind_b2MotorJointDef_get_correctionFactor_0=a.asm.Xs).apply(null,arguments)},sv=a._emscripten_bind_b2MotorJointDef_set_correctionFactor_1=function(){return(sv=a._emscripten_bind_b2MotorJointDef_set_correctionFactor_1=a.asm.Ys).apply(null,arguments)},tv=a._emscripten_bind_b2MotorJointDef_get_type_0=function(){return(tv=a._emscripten_bind_b2MotorJointDef_get_type_0=a.asm.Zs).apply(null,
arguments)},uv=a._emscripten_bind_b2MotorJointDef_set_type_1=function(){return(uv=a._emscripten_bind_b2MotorJointDef_set_type_1=a.asm._s).apply(null,arguments)},vv=a._emscripten_bind_b2MotorJointDef_get_userData_0=function(){return(vv=a._emscripten_bind_b2MotorJointDef_get_userData_0=a.asm.$s).apply(null,arguments)},wv=a._emscripten_bind_b2MotorJointDef_set_userData_1=function(){return(wv=a._emscripten_bind_b2MotorJointDef_set_userData_1=a.asm.at).apply(null,arguments)},xv=a._emscripten_bind_b2MotorJointDef_get_bodyA_0=
function(){return(xv=a._emscripten_bind_b2MotorJointDef_get_bodyA_0=a.asm.bt).apply(null,arguments)},yv=a._emscripten_bind_b2MotorJointDef_set_bodyA_1=function(){return(yv=a._emscripten_bind_b2MotorJointDef_set_bodyA_1=a.asm.ct).apply(null,arguments)},zv=a._emscripten_bind_b2MotorJointDef_get_bodyB_0=function(){return(zv=a._emscripten_bind_b2MotorJointDef_get_bodyB_0=a.asm.dt).apply(null,arguments)},Av=a._emscripten_bind_b2MotorJointDef_set_bodyB_1=function(){return(Av=a._emscripten_bind_b2MotorJointDef_set_bodyB_1=
a.asm.et).apply(null,arguments)},Bv=a._emscripten_bind_b2MotorJointDef_get_collideConnected_0=function(){return(Bv=a._emscripten_bind_b2MotorJointDef_get_collideConnected_0=a.asm.ft).apply(null,arguments)},Cv=a._emscripten_bind_b2MotorJointDef_set_collideConnected_1=function(){return(Cv=a._emscripten_bind_b2MotorJointDef_set_collideConnected_1=a.asm.gt).apply(null,arguments)},Dv=a._emscripten_bind_b2MotorJointDef___destroy___0=function(){return(Dv=a._emscripten_bind_b2MotorJointDef___destroy___0=
a.asm.ht).apply(null,arguments)},Ev=a._emscripten_enum_b2ShapeType_e_circle=function(){return(Ev=a._emscripten_enum_b2ShapeType_e_circle=a.asm.it).apply(null,arguments)},Fv=a._emscripten_enum_b2ShapeType_e_edge=function(){return(Fv=a._emscripten_enum_b2ShapeType_e_edge=a.asm.jt).apply(null,arguments)},Gv=a._emscripten_enum_b2ShapeType_e_polygon=function(){return(Gv=a._emscripten_enum_b2ShapeType_e_polygon=a.asm.kt).apply(null,arguments)},Hv=a._emscripten_enum_b2ShapeType_e_chain=function(){return(Hv=
a._emscripten_enum_b2ShapeType_e_chain=a.asm.lt).apply(null,arguments)},Iv=a._emscripten_enum_b2ShapeType_e_typeCount=function(){return(Iv=a._emscripten_enum_b2ShapeType_e_typeCount=a.asm.mt).apply(null,arguments)},Jv=a._emscripten_enum_b2JointType_e_unknownJoint=function(){return(Jv=a._emscripten_enum_b2JointType_e_unknownJoint=a.asm.nt).apply(null,arguments)},Kv=a._emscripten_enum_b2JointType_e_revoluteJoint=function(){return(Kv=a._emscripten_enum_b2JointType_e_revoluteJoint=a.asm.ot).apply(null,
arguments)},Lv=a._emscripten_enum_b2JointType_e_prismaticJoint=function(){return(Lv=a._emscripten_enum_b2JointType_e_prismaticJoint=a.asm.pt).apply(null,arguments)},Mv=a._emscripten_enum_b2JointType_e_distanceJoint=function(){return(Mv=a._emscripten_enum_b2JointType_e_distanceJoint=a.asm.qt).apply(null,arguments)},Nv=a._emscripten_enum_b2JointType_e_pulleyJoint=function(){return(Nv=a._emscripten_enum_b2JointType_e_pulleyJoint=a.asm.rt).apply(null,arguments)},Ov=a._emscripten_enum_b2JointType_e_mouseJoint=
function(){return(Ov=a._emscripten_enum_b2JointType_e_mouseJoint=a.asm.st).apply(null,arguments)},Pv=a._emscripten_enum_b2JointType_e_gearJoint=function(){return(Pv=a._emscripten_enum_b2JointType_e_gearJoint=a.asm.tt).apply(null,arguments)},Qv=a._emscripten_enum_b2JointType_e_wheelJoint=function(){return(Qv=a._emscripten_enum_b2JointType_e_wheelJoint=a.asm.ut).apply(null,arguments)},Rv=a._emscripten_enum_b2JointType_e_weldJoint=function(){return(Rv=a._emscripten_enum_b2JointType_e_weldJoint=a.asm.vt).apply(null,
arguments)},Sv=a._emscripten_enum_b2JointType_e_frictionJoint=function(){return(Sv=a._emscripten_enum_b2JointType_e_frictionJoint=a.asm.wt).apply(null,arguments)},Tv=a._emscripten_enum_b2JointType_e_ropeJoint=function(){return(Tv=a._emscripten_enum_b2JointType_e_ropeJoint=a.asm.xt).apply(null,arguments)},Uv=a._emscripten_enum_b2JointType_e_motorJoint=function(){return(Uv=a._emscripten_enum_b2JointType_e_motorJoint=a.asm.yt).apply(null,arguments)},Vv=a._emscripten_enum_b2LimitState_e_inactiveLimit=
function(){return(Vv=a._emscripten_enum_b2LimitState_e_inactiveLimit=a.asm.zt).apply(null,arguments)},Wv=a._emscripten_enum_b2LimitState_e_atLowerLimit=function(){return(Wv=a._emscripten_enum_b2LimitState_e_atLowerLimit=a.asm.At).apply(null,arguments)},Xv=a._emscripten_enum_b2LimitState_e_atUpperLimit=function(){return(Xv=a._emscripten_enum_b2LimitState_e_atUpperLimit=a.asm.Bt).apply(null,arguments)},Yv=a._emscripten_enum_b2LimitState_e_equalLimits=function(){return(Yv=a._emscripten_enum_b2LimitState_e_equalLimits=
a.asm.Ct).apply(null,arguments)},Zv=a._emscripten_enum_b2ManifoldType_e_circles=function(){return(Zv=a._emscripten_enum_b2ManifoldType_e_circles=a.asm.Dt).apply(null,arguments)},$v=a._emscripten_enum_b2ManifoldType_e_faceA=function(){return($v=a._emscripten_enum_b2ManifoldType_e_faceA=a.asm.Et).apply(null,arguments)},aw=a._emscripten_enum_b2ManifoldType_e_faceB=function(){return(aw=a._emscripten_enum_b2ManifoldType_e_faceB=a.asm.Ft).apply(null,arguments)},bw=a._emscripten_enum_b2BodyType_b2_staticBody=
function(){return(bw=a._emscripten_enum_b2BodyType_b2_staticBody=a.asm.Gt).apply(null,arguments)},cw=a._emscripten_enum_b2BodyType_b2_kinematicBody=function(){return(cw=a._emscripten_enum_b2BodyType_b2_kinematicBody=a.asm.Ht).apply(null,arguments)},dw=a._emscripten_enum_b2BodyType_b2_dynamicBody=function(){return(dw=a._emscripten_enum_b2BodyType_b2_dynamicBody=a.asm.It).apply(null,arguments)},ew=a._emscripten_enum_b2DrawFlag_e_shapeBit=function(){return(ew=a._emscripten_enum_b2DrawFlag_e_shapeBit=
a.asm.Jt).apply(null,arguments)},fw=a._emscripten_enum_b2DrawFlag_e_jointBit=function(){return(fw=a._emscripten_enum_b2DrawFlag_e_jointBit=a.asm.Kt).apply(null,arguments)},gw=a._emscripten_enum_b2DrawFlag_e_aabbBit=function(){return(gw=a._emscripten_enum_b2DrawFlag_e_aabbBit=a.asm.Lt).apply(null,arguments)},hw=a._emscripten_enum_b2DrawFlag_e_pairBit=function(){return(hw=a._emscripten_enum_b2DrawFlag_e_pairBit=a.asm.Mt).apply(null,arguments)},iw=a._emscripten_enum_b2DrawFlag_e_centerOfMassBit=function(){return(iw=
a._emscripten_enum_b2DrawFlag_e_centerOfMassBit=a.asm.Nt).apply(null,arguments)},jw=a._emscripten_enum_b2ContactFeatureType_e_vertex=function(){return(jw=a._emscripten_enum_b2ContactFeatureType_e_vertex=a.asm.Ot).apply(null,arguments)},kw=a._emscripten_enum_b2ContactFeatureType_e_face=function(){return(kw=a._emscripten_enum_b2ContactFeatureType_e_face=a.asm.Pt).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.Qt).apply(null,arguments)};
a._free=function(){return(a._free=a.asm.Rt).apply(null,arguments)};a.dynCall_vi=function(){return(a.dynCall_vi=a.asm.St).apply(null,arguments)};a.dynCall_v=function(){return(a.dynCall_v=a.asm.Tt).apply(null,arguments)};a.asm=bb;var lw;Oa=function mw(){lw||nw();lw||(Oa=mw)};
function nw(){function b(){if(!lw&&(lw=!0,a.calledRun=!0,!ua)){Ka=!0;Fa(Ha);Fa(Ia);aa(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;){var c=a.postRun.shift();Ja.unshift(c)}Fa(Ja)}}if(!(0<Ma)){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)La();Fa(Ga);0<Ma||(a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1);b()},1)):
b())}}a.run=nw;if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0<a.preInit.length;)a.preInit.pop()();noExitRuntime=!0;nw();function e(){}e.prototype=Object.create(e.prototype);e.prototype.constructor=e;e.prototype.Vt=e;e.Wt={};a.WrapperObject=e;function g(b){return(b||e).Wt}a.getCache=g;function h(b,c){var d=g(c),f=d[b];if(f)return f;f=Object.create((c||e).prototype);f.Ut=b;return d[b]=f}a.wrapPointer=h;a.castObject=function(b,c){return h(b.Ut,c)};a.NULL=h(0);
a.destroy=function(b){if(!b.__destroy__)throw"Error: Cannot destroy object. (Did you create it yourself?)";b.__destroy__();delete g(b.Vt)[b.Ut]};a.compare=function(b,c){return b.Ut===c.Ut};a.getPointer=function(b){return b.Ut};a.getClass=function(b){return b.Vt};var ow=0,pw=0,qw=[],rw=0;function sw(){if(rw){for(var b=0;b<qw.length;b++)a._free(qw[b]);qw.length=0;a._free(ow);ow=0;pw+=rw;rw=0}ow||(pw+=128,ow=a._malloc(pw),assert(ow))}
function tw(){throw"cannot construct a b2DestructionListenerWrapper, no constructor in IDL";}tw.prototype=Object.create(e.prototype);tw.prototype.constructor=tw;tw.prototype.Vt=tw;tw.Wt={};a.b2DestructionListenerWrapper=tw;tw.prototype.__destroy__=function(){cb(this.Ut)};function uw(){throw"cannot construct a b2Draw, no constructor in IDL";}uw.prototype=Object.create(e.prototype);uw.prototype.constructor=uw;uw.prototype.Vt=uw;uw.Wt={};a.b2Draw=uw;
uw.prototype.SetFlags=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);db(c,b)};uw.prototype.GetFlags=function(){return eb(this.Ut)};uw.prototype.AppendFlags=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);fb(c,b)};uw.prototype.ClearFlags=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);gb(c,b)};uw.prototype.__destroy__=function(){hb(this.Ut)};function k(){throw"cannot construct a b2Joint, no constructor in IDL";}k.prototype=Object.create(e.prototype);
k.prototype.constructor=k;k.prototype.Vt=k;k.Wt={};a.b2Joint=k;k.prototype.GetType=function(){return ib(this.Ut)};k.prototype.GetBodyA=function(){return h(mb(this.Ut),l)};k.prototype.GetBodyB=function(){return h(nb(this.Ut),l)};k.prototype.GetAnchorA=function(){return h(ob(this.Ut),m)};k.prototype.GetAnchorB=function(){return h(pb(this.Ut),m)};k.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(qb(c,b),m)};
k.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return rb(c,b)};k.prototype.GetNext=function(){return h(sb(this.Ut),k)};k.prototype.GetUserData=function(){return tb(this.Ut)};k.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ub(c,b)};k.prototype.IsActive=function(){return!!vb(this.Ut)};k.prototype.GetCollideConnected=function(){return!!wb(this.Ut)};k.prototype.Dump=function(){xb(this.Ut)};
function vw(){throw"cannot construct a b2RayCastCallback, no constructor in IDL";}vw.prototype=Object.create(e.prototype);vw.prototype.constructor=vw;vw.prototype.Vt=vw;vw.Wt={};a.b2RayCastCallback=vw;vw.prototype.__destroy__=function(){yb(this.Ut)};function ww(){throw"cannot construct a b2ContactListener, no constructor in IDL";}ww.prototype=Object.create(e.prototype);ww.prototype.constructor=ww;ww.prototype.Vt=ww;ww.Wt={};a.b2ContactListener=ww;ww.prototype.__destroy__=function(){zb(this.Ut)};
function xw(){throw"cannot construct a b2QueryCallback, no constructor in IDL";}xw.prototype=Object.create(e.prototype);xw.prototype.constructor=xw;xw.prototype.Vt=xw;xw.Wt={};a.b2QueryCallback=xw;xw.prototype.__destroy__=function(){Ab(this.Ut)};function n(){this.Ut=Bb();g(n)[this.Ut]=this}n.prototype=Object.create(e.prototype);n.prototype.constructor=n;n.prototype.Vt=n;n.Wt={};a.b2JointDef=n;n.prototype.get_type=n.prototype.Xt=function(){return Cb(this.Ut)};
n.prototype.set_type=n.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Db(c,b)};Object.defineProperty(n.prototype,"type",{get:n.prototype.Xt,set:n.prototype.Zt});n.prototype.get_userData=n.prototype.Yt=function(){return Eb(this.Ut)};n.prototype.set_userData=n.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Fb(c,b)};Object.defineProperty(n.prototype,"userData",{get:n.prototype.Yt,set:n.prototype.$t});
n.prototype.get_bodyA=n.prototype.au=function(){return h(Gb(this.Ut),l)};n.prototype.set_bodyA=n.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Hb(c,b)};Object.defineProperty(n.prototype,"bodyA",{get:n.prototype.au,set:n.prototype.du});n.prototype.get_bodyB=n.prototype.bu=function(){return h(Ib(this.Ut),l)};n.prototype.set_bodyB=n.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Jb(c,b)};
Object.defineProperty(n.prototype,"bodyB",{get:n.prototype.bu,set:n.prototype.eu});n.prototype.get_collideConnected=n.prototype.cu=function(){return!!Kb(this.Ut)};n.prototype.set_collideConnected=n.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lb(c,b)};Object.defineProperty(n.prototype,"collideConnected",{get:n.prototype.cu,set:n.prototype.fu});n.prototype.__destroy__=function(){Mb(this.Ut)};function p(){throw"cannot construct a b2Shape, no constructor in IDL";}
p.prototype=Object.create(e.prototype);p.prototype.constructor=p;p.prototype.Vt=p;p.Wt={};a.b2Shape=p;p.prototype.GetType=function(){return Nb(this.Ut)};p.prototype.GetChildCount=function(){return Ob(this.Ut)};p.prototype.TestPoint=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return!!Pb(d,b,c)};
p.prototype.RayCast=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);return!!Qb(y,b,c,d,f)};p.prototype.ComputeAABB=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Rb(f,b,c,d)};p.prototype.ComputeMass=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Sb(d,b,c)};
p.prototype.get_m_type=p.prototype.lu=function(){return Tb(this.Ut)};p.prototype.set_m_type=p.prototype.nu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ub(c,b)};Object.defineProperty(p.prototype,"m_type",{get:p.prototype.lu,set:p.prototype.nu});p.prototype.get_m_radius=p.prototype.ku=function(){return Vb(this.Ut)};p.prototype.set_m_radius=p.prototype.mu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Wb(c,b)};
Object.defineProperty(p.prototype,"m_radius",{get:p.prototype.ku,set:p.prototype.mu});p.prototype.__destroy__=function(){Xb(this.Ut)};function yw(){throw"cannot construct a b2ContactFilter, no constructor in IDL";}yw.prototype=Object.create(e.prototype);yw.prototype.constructor=yw;yw.prototype.Vt=yw;yw.Wt={};a.b2ContactFilter=yw;yw.prototype.__destroy__=function(){Yb(this.Ut)};function zw(){this.Ut=Zb();g(zw)[this.Ut]=this}zw.prototype=Object.create(tw.prototype);zw.prototype.constructor=zw;
zw.prototype.Vt=zw;zw.Wt={};a.JSDestructionListener=zw;zw.prototype.SayGoodbyeJoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);$b(c,b)};zw.prototype.SayGoodbyeFixture=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ac(c,b)};zw.prototype.__destroy__=function(){bc(this.Ut)};function Aw(){throw"cannot construct a b2ContactImpulse, no constructor in IDL";}Aw.prototype=Object.create(e.prototype);Aw.prototype.constructor=Aw;Aw.prototype.Vt=Aw;Aw.Wt={};a.b2ContactImpulse=Aw;
Aw.prototype.get_count=Aw.prototype.xv=function(){return cc(this.Ut)};Aw.prototype.set_count=Aw.prototype.kx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);dc(c,b)};Object.defineProperty(Aw.prototype,"count",{get:Aw.prototype.xv,set:Aw.prototype.kx});Aw.prototype.__destroy__=function(){ec(this.Ut)};function Bw(){throw"cannot construct a b2DistanceJoint, no constructor in IDL";}Bw.prototype=Object.create(k.prototype);Bw.prototype.constructor=Bw;Bw.prototype.Vt=Bw;Bw.Wt={};
a.b2DistanceJoint=Bw;Bw.prototype.GetLocalAnchorA=function(){return h(fc(this.Ut),m)};Bw.prototype.GetLocalAnchorB=function(){return h(hc(this.Ut),m)};Bw.prototype.SetLength=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ic(c,b)};Bw.prototype.GetLength=function(){return jc(this.Ut)};Bw.prototype.SetFrequency=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);kc(c,b)};Bw.prototype.GetFrequency=function(){return lc(this.Ut)};
Bw.prototype.SetDampingRatio=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);mc(c,b)};Bw.prototype.GetDampingRatio=function(){return nc(this.Ut)};Bw.prototype.GetType=function(){return oc(this.Ut)};Bw.prototype.GetBodyA=function(){return h(pc(this.Ut),l)};Bw.prototype.GetBodyB=function(){return h(qc(this.Ut),l)};Bw.prototype.GetAnchorA=function(){return h(rc(this.Ut),m)};Bw.prototype.GetAnchorB=function(){return h(sc(this.Ut),m)};
Bw.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(tc(c,b),m)};Bw.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return uc(c,b)};Bw.prototype.GetNext=function(){return h(vc(this.Ut),k)};Bw.prototype.GetUserData=function(){return wc(this.Ut)};Bw.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);xc(c,b)};Bw.prototype.IsActive=function(){return!!yc(this.Ut)};
Bw.prototype.GetCollideConnected=function(){return!!zc(this.Ut)};Bw.prototype.__destroy__=function(){Ac(this.Ut)};function q(b,c,d){b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);this.Ut=void 0===b?Bc():void 0===c?_emscripten_bind_b2Mat33_b2Mat33_1(b):void 0===d?_emscripten_bind_b2Mat33_b2Mat33_2(b,c):Cc(b,c,d);g(q)[this.Ut]=this}q.prototype=Object.create(e.prototype);q.prototype.constructor=q;q.prototype.Vt=q;q.Wt={};a.b2Mat33=q;
q.prototype.SetZero=function(){Dc(this.Ut)};q.prototype.Solve33=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Ec(c,b),r)};q.prototype.Solve22=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Fc(c,b),m)};q.prototype.GetInverse22=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Gc(c,b)};q.prototype.GetSymInverse33=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Hc(c,b)};q.prototype.get_ex=q.prototype.Cu=function(){return h(Ic(this.Ut),r)};
q.prototype.set_ex=q.prototype.Ru=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Jc(c,b)};Object.defineProperty(q.prototype,"ex",{get:q.prototype.Cu,set:q.prototype.Ru});q.prototype.get_ey=q.prototype.Du=function(){return h(Kc(this.Ut),r)};q.prototype.set_ey=q.prototype.Su=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lc(c,b)};Object.defineProperty(q.prototype,"ey",{get:q.prototype.Du,set:q.prototype.Su});q.prototype.get_ez=q.prototype.zv=function(){return h(Mc(this.Ut),r)};
q.prototype.set_ez=q.prototype.mx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Nc(c,b)};Object.defineProperty(q.prototype,"ez",{get:q.prototype.zv,set:q.prototype.mx});q.prototype.__destroy__=function(){Oc(this.Ut)};function t(){throw"cannot construct a b2Fixture, no constructor in IDL";}t.prototype=Object.create(e.prototype);t.prototype.constructor=t;t.prototype.Vt=t;t.Wt={};a.b2Fixture=t;t.prototype.GetType=function(){return Pc(this.Ut)};
t.prototype.GetShape=function(){return h(Qc(this.Ut),p)};t.prototype.SetSensor=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Rc(c,b)};t.prototype.IsSensor=function(){return!!Sc(this.Ut)};t.prototype.SetFilterData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Tc(c,b)};t.prototype.GetFilterData=function(){return h(Uc(this.Ut),u)};t.prototype.Refilter=function(){Vc(this.Ut)};t.prototype.GetBody=function(){return h(Wc(this.Ut),l)};
t.prototype.GetNext=function(){return h(Xc(this.Ut),t)};t.prototype.GetUserData=function(){return Yc(this.Ut)};t.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zc(c,b)};t.prototype.TestPoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return!!$c(c,b)};t.prototype.RayCast=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);return!!ad(f,b,c,d)};
t.prototype.GetMassData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);bd(c,b)};t.prototype.SetDensity=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);cd(c,b)};t.prototype.GetDensity=function(){return dd(this.Ut)};t.prototype.GetFriction=function(){return ed(this.Ut)};t.prototype.SetFriction=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);fd(c,b)};t.prototype.GetRestitution=function(){return gd(this.Ut)};
t.prototype.SetRestitution=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);hd(c,b)};t.prototype.GetAABB=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(id(c,b),v)};t.prototype.Dump=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);jd(c,b)};t.prototype.__destroy__=function(){kd(this.Ut)};function u(){this.Ut=ld();g(u)[this.Ut]=this}u.prototype=Object.create(e.prototype);u.prototype.constructor=u;u.prototype.Vt=u;u.Wt={};a.b2Filter=u;
u.prototype.get_categoryBits=u.prototype.rv=function(){return md(this.Ut)};u.prototype.set_categoryBits=u.prototype.ex=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);nd(c,b)};Object.defineProperty(u.prototype,"categoryBits",{get:u.prototype.rv,set:u.prototype.ex});u.prototype.get_maskBits=u.prototype.nw=function(){return od(this.Ut)};u.prototype.set_maskBits=u.prototype.ay=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);pd(c,b)};
Object.defineProperty(u.prototype,"maskBits",{get:u.prototype.nw,set:u.prototype.ay});u.prototype.get_groupIndex=u.prototype.Iv=function(){return qd(this.Ut)};u.prototype.set_groupIndex=u.prototype.vx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);rd(c,b)};Object.defineProperty(u.prototype,"groupIndex",{get:u.prototype.Iv,set:u.prototype.vx});u.prototype.__destroy__=function(){sd(this.Ut)};function Cw(){this.Ut=td();g(Cw)[this.Ut]=this}Cw.prototype=Object.create(xw.prototype);
Cw.prototype.constructor=Cw;Cw.prototype.Vt=Cw;Cw.Wt={};a.JSQueryCallback=Cw;Cw.prototype.ReportFixture=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return!!ud(c,b)};Cw.prototype.__destroy__=function(){vd(this.Ut)};function Dw(){throw"cannot construct a b2MouseJoint, no constructor in IDL";}Dw.prototype=Object.create(k.prototype);Dw.prototype.constructor=Dw;Dw.prototype.Vt=Dw;Dw.Wt={};a.b2MouseJoint=Dw;
Dw.prototype.SetTarget=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wd(c,b)};Dw.prototype.GetTarget=function(){return h(xd(this.Ut),m)};Dw.prototype.SetMaxForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);yd(c,b)};Dw.prototype.GetMaxForce=function(){return zd(this.Ut)};Dw.prototype.SetFrequency=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ad(c,b)};Dw.prototype.GetFrequency=function(){return Bd(this.Ut)};
Dw.prototype.SetDampingRatio=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Cd(c,b)};Dw.prototype.GetDampingRatio=function(){return Dd(this.Ut)};Dw.prototype.GetType=function(){return Ed(this.Ut)};Dw.prototype.GetBodyA=function(){return h(Fd(this.Ut),l)};Dw.prototype.GetBodyB=function(){return h(Gd(this.Ut),l)};Dw.prototype.GetAnchorA=function(){return h(Hd(this.Ut),m)};Dw.prototype.GetAnchorB=function(){return h(Id(this.Ut),m)};
Dw.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Jd(c,b),m)};Dw.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return Kd(c,b)};Dw.prototype.GetNext=function(){return h(Ld(this.Ut),k)};Dw.prototype.GetUserData=function(){return Md(this.Ut)};Dw.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Nd(c,b)};Dw.prototype.IsActive=function(){return!!Od(this.Ut)};
Dw.prototype.GetCollideConnected=function(){return!!Pd(this.Ut)};Dw.prototype.__destroy__=function(){Qd(this.Ut)};function Ew(b){b&&"object"===typeof b&&(b=b.Ut);this.Ut=void 0===b?Rd():Sd(b);g(Ew)[this.Ut]=this}Ew.prototype=Object.create(e.prototype);Ew.prototype.constructor=Ew;Ew.prototype.Vt=Ew;Ew.Wt={};a.b2Rot=Ew;Ew.prototype.Set=Ew.prototype.Set=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Td(c,b)};Ew.prototype.SetIdentity=function(){Ud(this.Ut)};Ew.prototype.GetAngle=function(){return Vd(this.Ut)};
Ew.prototype.GetXAxis=function(){return h(Wd(this.Ut),m)};Ew.prototype.GetYAxis=function(){return h(Xd(this.Ut),m)};Ew.prototype.get_s=Ew.prototype.Cw=function(){return Yd(this.Ut)};Ew.prototype.set_s=Ew.prototype.py=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zd(c,b)};Object.defineProperty(Ew.prototype,"s",{get:Ew.prototype.Cw,set:Ew.prototype.py});Ew.prototype.get_c=Ew.prototype.qv=function(){return $d(this.Ut)};
Ew.prototype.set_c=Ew.prototype.dx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ae(c,b)};Object.defineProperty(Ew.prototype,"c",{get:Ew.prototype.qv,set:Ew.prototype.dx});Ew.prototype.__destroy__=function(){be(this.Ut)};function Fw(){throw"cannot construct a b2MotorJoint, no constructor in IDL";}Fw.prototype=Object.create(k.prototype);Fw.prototype.constructor=Fw;Fw.prototype.Vt=Fw;Fw.Wt={};a.b2MotorJoint=Fw;
Fw.prototype.SetLinearOffset=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ce(c,b)};Fw.prototype.GetLinearOffset=function(){return h(de(this.Ut),m)};Fw.prototype.SetAngularOffset=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ee(c,b)};Fw.prototype.GetAngularOffset=function(){return fe(this.Ut)};Fw.prototype.SetMaxForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ge(c,b)};Fw.prototype.GetMaxForce=function(){return he(this.Ut)};
Fw.prototype.SetMaxTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ie(c,b)};Fw.prototype.GetMaxTorque=function(){return je(this.Ut)};Fw.prototype.SetCorrectionFactor=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ke(c,b)};Fw.prototype.GetCorrectionFactor=function(){return le(this.Ut)};Fw.prototype.GetType=function(){return me(this.Ut)};Fw.prototype.GetBodyA=function(){return h(ne(this.Ut),l)};Fw.prototype.GetBodyB=function(){return h(oe(this.Ut),l)};
Fw.prototype.GetAnchorA=function(){return h(pe(this.Ut),m)};Fw.prototype.GetAnchorB=function(){return h(qe(this.Ut),m)};Fw.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(re(c,b),m)};Fw.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return se(c,b)};Fw.prototype.GetNext=function(){return h(te(this.Ut),k)};Fw.prototype.GetUserData=function(){return ue(this.Ut)};
Fw.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ve(c,b)};Fw.prototype.IsActive=function(){return!!we(this.Ut)};Fw.prototype.GetCollideConnected=function(){return!!xe(this.Ut)};Fw.prototype.__destroy__=function(){ye(this.Ut)};function w(){throw"cannot construct a b2Profile, no constructor in IDL";}w.prototype=Object.create(e.prototype);w.prototype.constructor=w;w.prototype.Vt=w;w.Wt={};a.b2Profile=w;w.prototype.get_step=w.prototype.Kw=function(){return ze(this.Ut)};
w.prototype.set_step=w.prototype.xy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ae(c,b)};Object.defineProperty(w.prototype,"step",{get:w.prototype.Kw,set:w.prototype.xy});w.prototype.get_collide=w.prototype.uv=function(){return Be(this.Ut)};w.prototype.set_collide=w.prototype.hx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ce(c,b)};Object.defineProperty(w.prototype,"collide",{get:w.prototype.uv,set:w.prototype.hx});w.prototype.get_solve=w.prototype.Fw=function(){return De(this.Ut)};
w.prototype.set_solve=w.prototype.sy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ee(c,b)};Object.defineProperty(w.prototype,"solve",{get:w.prototype.Fw,set:w.prototype.sy});w.prototype.get_solveInit=w.prototype.Gw=function(){return Fe(this.Ut)};w.prototype.set_solveInit=w.prototype.ty=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ge(c,b)};Object.defineProperty(w.prototype,"solveInit",{get:w.prototype.Gw,set:w.prototype.ty});
w.prototype.get_solveVelocity=w.prototype.Jw=function(){return He(this.Ut)};w.prototype.set_solveVelocity=w.prototype.wy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ie(c,b)};Object.defineProperty(w.prototype,"solveVelocity",{get:w.prototype.Jw,set:w.prototype.wy});w.prototype.get_solvePosition=w.prototype.Hw=function(){return Je(this.Ut)};w.prototype.set_solvePosition=w.prototype.uy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ke(c,b)};
Object.defineProperty(w.prototype,"solvePosition",{get:w.prototype.Hw,set:w.prototype.uy});w.prototype.get_broadphase=w.prototype.ov=function(){return Le(this.Ut)};w.prototype.set_broadphase=w.prototype.bx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Me(c,b)};Object.defineProperty(w.prototype,"broadphase",{get:w.prototype.ov,set:w.prototype.bx});w.prototype.get_solveTOI=w.prototype.Iw=function(){return Ne(this.Ut)};
w.prototype.set_solveTOI=w.prototype.vy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Oe(c,b)};Object.defineProperty(w.prototype,"solveTOI",{get:w.prototype.Iw,set:w.prototype.vy});w.prototype.__destroy__=function(){Pe(this.Ut)};function Gw(){throw"cannot construct a VoidPtr, no constructor in IDL";}Gw.prototype=Object.create(e.prototype);Gw.prototype.constructor=Gw;Gw.prototype.Vt=Gw;Gw.Wt={};a.VoidPtr=Gw;Gw.prototype.__destroy__=function(){Qe(this.Ut)};
function x(){this.Ut=Re();g(x)[this.Ut]=this}x.prototype=Object.create(e.prototype);x.prototype.constructor=x;x.prototype.Vt=x;x.Wt={};a.b2BodyDef=x;x.prototype.get_type=x.prototype.Xt=function(){return Se(this.Ut)};x.prototype.set_type=x.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Te(c,b)};Object.defineProperty(x.prototype,"type",{get:x.prototype.Xt,set:x.prototype.Zt});x.prototype.get_position=x.prototype.yw=function(){return h(Ue(this.Ut),m)};
x.prototype.set_position=x.prototype.ly=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ve(c,b)};Object.defineProperty(x.prototype,"position",{get:x.prototype.yw,set:x.prototype.ly});x.prototype.get_angle=x.prototype.iv=function(){return We(this.Ut)};x.prototype.set_angle=x.prototype.Ww=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xe(c,b)};Object.defineProperty(x.prototype,"angle",{get:x.prototype.iv,set:x.prototype.Ww});
x.prototype.get_linearVelocity=x.prototype.Wv=function(){return h(Ye(this.Ut),m)};x.prototype.set_linearVelocity=x.prototype.Jx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ze(c,b)};Object.defineProperty(x.prototype,"linearVelocity",{get:x.prototype.Wv,set:x.prototype.Jx});x.prototype.get_angularVelocity=x.prototype.lv=function(){return $e(this.Ut)};x.prototype.set_angularVelocity=x.prototype.Zw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);af(c,b)};
Object.defineProperty(x.prototype,"angularVelocity",{get:x.prototype.lv,set:x.prototype.Zw});x.prototype.get_linearDamping=x.prototype.Uv=function(){return bf(this.Ut)};x.prototype.set_linearDamping=x.prototype.Hx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);cf(c,b)};Object.defineProperty(x.prototype,"linearDamping",{get:x.prototype.Uv,set:x.prototype.Hx});x.prototype.get_angularDamping=x.prototype.jv=function(){return df(this.Ut)};
x.prototype.set_angularDamping=x.prototype.Xw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ef(c,b)};Object.defineProperty(x.prototype,"angularDamping",{get:x.prototype.jv,set:x.prototype.Xw});x.prototype.get_allowSleep=x.prototype.hv=function(){return!!ff(this.Ut)};x.prototype.set_allowSleep=x.prototype.Vw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);gf(c,b)};Object.defineProperty(x.prototype,"allowSleep",{get:x.prototype.hv,set:x.prototype.Vw});
x.prototype.get_awake=x.prototype.mv=function(){return!!hf(this.Ut)};x.prototype.set_awake=x.prototype.$w=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);jf(c,b)};Object.defineProperty(x.prototype,"awake",{get:x.prototype.mv,set:x.prototype.$w});x.prototype.get_fixedRotation=x.prototype.Bv=function(){return!!kf(this.Ut)};x.prototype.set_fixedRotation=x.prototype.ox=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);lf(c,b)};
Object.defineProperty(x.prototype,"fixedRotation",{get:x.prototype.Bv,set:x.prototype.ox});x.prototype.get_bullet=x.prototype.pv=function(){return!!mf(this.Ut)};x.prototype.set_bullet=x.prototype.cx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);nf(c,b)};Object.defineProperty(x.prototype,"bullet",{get:x.prototype.pv,set:x.prototype.cx});x.prototype.get_active=x.prototype.gv=function(){return!!of(this.Ut)};
x.prototype.set_active=x.prototype.Uw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);pf(c,b)};Object.defineProperty(x.prototype,"active",{get:x.prototype.gv,set:x.prototype.Uw});x.prototype.get_userData=x.prototype.Yt=function(){return qf(this.Ut)};x.prototype.set_userData=x.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);rf(c,b)};Object.defineProperty(x.prototype,"userData",{get:x.prototype.Yt,set:x.prototype.$t});x.prototype.get_gravityScale=x.prototype.Fv=function(){return sf(this.Ut)};
x.prototype.set_gravityScale=x.prototype.sx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);tf(c,b)};Object.defineProperty(x.prototype,"gravityScale",{get:x.prototype.Fv,set:x.prototype.sx});x.prototype.__destroy__=function(){uf(this.Ut)};function Hw(){this.Ut=vf();g(Hw)[this.Ut]=this}Hw.prototype=Object.create(vw.prototype);Hw.prototype.constructor=Hw;Hw.prototype.Vt=Hw;Hw.Wt={};a.JSRayCastCallback=Hw;
Hw.prototype.ReportFixture=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);return wf(y,b,c,d,f)};Hw.prototype.__destroy__=function(){xf(this.Ut)};function z(){throw"cannot construct a b2ContactFeature, no constructor in IDL";}z.prototype=Object.create(e.prototype);z.prototype.constructor=z;z.prototype.Vt=z;z.Wt={};a.b2ContactFeature=z;z.prototype.get_indexA=z.prototype.Kv=function(){return yf(this.Ut)};
z.prototype.set_indexA=z.prototype.xx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);zf(c,b)};Object.defineProperty(z.prototype,"indexA",{get:z.prototype.Kv,set:z.prototype.xx});z.prototype.get_indexB=z.prototype.Lv=function(){return Af(this.Ut)};z.prototype.set_indexB=z.prototype.yx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Bf(c,b)};Object.defineProperty(z.prototype,"indexB",{get:z.prototype.Lv,set:z.prototype.yx});z.prototype.get_typeA=z.prototype.Nw=function(){return Cf(this.Ut)};
z.prototype.set_typeA=z.prototype.Ay=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Df(c,b)};Object.defineProperty(z.prototype,"typeA",{get:z.prototype.Nw,set:z.prototype.Ay});z.prototype.get_typeB=z.prototype.Ow=function(){return Ef(this.Ut)};z.prototype.set_typeB=z.prototype.By=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ff(c,b)};Object.defineProperty(z.prototype,"typeB",{get:z.prototype.Ow,set:z.prototype.By});z.prototype.__destroy__=function(){Gf(this.Ut)};
function m(b,c){b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);this.Ut=void 0===b?Hf():void 0===c?_emscripten_bind_b2Vec2_b2Vec2_1(b):If(b,c);g(m)[this.Ut]=this}m.prototype=Object.create(e.prototype);m.prototype.constructor=m;m.prototype.Vt=m;m.Wt={};a.b2Vec2=m;m.prototype.SetZero=function(){Jf(this.Ut)};m.prototype.Set=m.prototype.Set=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Kf(d,b,c)};
m.prototype.op_add=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lf(c,b)};m.prototype.op_sub=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Mf(c,b)};m.prototype.op_mul=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Nf(c,b)};m.prototype.Length=function(){return Of(this.Ut)};m.prototype.LengthSquared=function(){return Pf(this.Ut)};m.prototype.Normalize=function(){return Qf(this.Ut)};m.prototype.IsValid=function(){return!!Rf(this.Ut)};
m.prototype.Skew=function(){return h(Sf(this.Ut),m)};m.prototype.get_x=m.prototype.Ou=function(){return Tf(this.Ut)};m.prototype.set_x=m.prototype.cv=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Uf(c,b)};Object.defineProperty(m.prototype,"x",{get:m.prototype.Ou,set:m.prototype.cv});m.prototype.get_y=m.prototype.Pu=function(){return Vf(this.Ut)};m.prototype.set_y=m.prototype.dv=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Wf(c,b)};
Object.defineProperty(m.prototype,"y",{get:m.prototype.Pu,set:m.prototype.dv});m.prototype.__destroy__=function(){Xf(this.Ut)};function r(b,c,d){b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);this.Ut=void 0===b?Yf():void 0===c?_emscripten_bind_b2Vec3_b2Vec3_1(b):void 0===d?_emscripten_bind_b2Vec3_b2Vec3_2(b,c):Zf(b,c,d);g(r)[this.Ut]=this}r.prototype=Object.create(e.prototype);r.prototype.constructor=r;r.prototype.Vt=r;r.Wt={};a.b2Vec3=r;
r.prototype.SetZero=function(){$f(this.Ut)};r.prototype.Set=r.prototype.Set=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);ag(f,b,c,d)};r.prototype.op_add=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);bg(c,b)};r.prototype.op_sub=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);cg(c,b)};r.prototype.op_mul=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);dg(c,b)};
r.prototype.get_x=r.prototype.Ou=function(){return eg(this.Ut)};r.prototype.set_x=r.prototype.cv=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);fg(c,b)};Object.defineProperty(r.prototype,"x",{get:r.prototype.Ou,set:r.prototype.cv});r.prototype.get_y=r.prototype.Pu=function(){return gg(this.Ut)};r.prototype.set_y=r.prototype.dv=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);hg(c,b)};Object.defineProperty(r.prototype,"y",{get:r.prototype.Pu,set:r.prototype.dv});
r.prototype.get_z=r.prototype.Sw=function(){return ig(this.Ut)};r.prototype.set_z=r.prototype.Fy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);jg(c,b)};Object.defineProperty(r.prototype,"z",{get:r.prototype.Sw,set:r.prototype.Fy});r.prototype.__destroy__=function(){kg(this.Ut)};function v(){this.Ut=lg();g(v)[this.Ut]=this}v.prototype=Object.create(e.prototype);v.prototype.constructor=v;v.prototype.Vt=v;v.Wt={};a.b2AABB=v;v.prototype.IsValid=function(){return!!mg(this.Ut)};
v.prototype.GetCenter=function(){return h(ng(this.Ut),m)};v.prototype.GetExtents=function(){return h(og(this.Ut),m)};v.prototype.GetPerimeter=function(){return pg(this.Ut)};v.prototype.Combine=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);void 0===c?qg(d,b):rg(d,b,c)};v.prototype.Contains=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return!!sg(c,b)};
v.prototype.RayCast=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return!!tg(d,b,c)};v.prototype.get_lowerBound=v.prototype.Zv=function(){return h(ug(this.Ut),m)};v.prototype.set_lowerBound=v.prototype.Mx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);vg(c,b)};Object.defineProperty(v.prototype,"lowerBound",{get:v.prototype.Zv,set:v.prototype.Mx});v.prototype.get_upperBound=v.prototype.Qw=function(){return h(wg(this.Ut),m)};
v.prototype.set_upperBound=v.prototype.Dy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);xg(c,b)};Object.defineProperty(v.prototype,"upperBound",{get:v.prototype.Qw,set:v.prototype.Dy});v.prototype.__destroy__=function(){yg(this.Ut)};function A(){this.Ut=zg();g(A)[this.Ut]=this}A.prototype=Object.create(e.prototype);A.prototype.constructor=A;A.prototype.Vt=A;A.Wt={};a.b2FixtureDef=A;A.prototype.get_shape=A.prototype.Ew=function(){return h(Ag(this.Ut),p)};
A.prototype.set_shape=A.prototype.ry=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Bg(c,b)};Object.defineProperty(A.prototype,"shape",{get:A.prototype.Ew,set:A.prototype.ry});A.prototype.get_userData=A.prototype.Yt=function(){return Cg(this.Ut)};A.prototype.set_userData=A.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Dg(c,b)};Object.defineProperty(A.prototype,"userData",{get:A.prototype.Yt,set:A.prototype.$t});A.prototype.get_friction=A.prototype.Dv=function(){return Eg(this.Ut)};
A.prototype.set_friction=A.prototype.qx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Fg(c,b)};Object.defineProperty(A.prototype,"friction",{get:A.prototype.Dv,set:A.prototype.qx});A.prototype.get_restitution=A.prototype.Bw=function(){return Gg(this.Ut)};A.prototype.set_restitution=A.prototype.oy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Hg(c,b)};Object.defineProperty(A.prototype,"restitution",{get:A.prototype.Bw,set:A.prototype.oy});
A.prototype.get_density=A.prototype.yv=function(){return Ig(this.Ut)};A.prototype.set_density=A.prototype.lx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Jg(c,b)};Object.defineProperty(A.prototype,"density",{get:A.prototype.yv,set:A.prototype.lx});A.prototype.get_isSensor=A.prototype.Mv=function(){return!!Kg(this.Ut)};A.prototype.set_isSensor=A.prototype.zx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lg(c,b)};
Object.defineProperty(A.prototype,"isSensor",{get:A.prototype.Mv,set:A.prototype.zx});A.prototype.get_filter=A.prototype.Av=function(){return h(Mg(this.Ut),u)};A.prototype.set_filter=A.prototype.nx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ng(c,b)};Object.defineProperty(A.prototype,"filter",{get:A.prototype.Av,set:A.prototype.nx});A.prototype.__destroy__=function(){Og(this.Ut)};function B(){this.Ut=Pg();g(B)[this.Ut]=this}B.prototype=Object.create(n.prototype);
B.prototype.constructor=B;B.prototype.Vt=B;B.Wt={};a.b2FrictionJointDef=B;B.prototype.Initialize=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Qg(f,b,c,d)};B.prototype.get_localAnchorA=B.prototype.gu=function(){return h(Rg(this.Ut),m)};B.prototype.set_localAnchorA=B.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Sg(c,b)};Object.defineProperty(B.prototype,"localAnchorA",{get:B.prototype.gu,set:B.prototype.iu});
B.prototype.get_localAnchorB=B.prototype.hu=function(){return h(Tg(this.Ut),m)};B.prototype.set_localAnchorB=B.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ug(c,b)};Object.defineProperty(B.prototype,"localAnchorB",{get:B.prototype.hu,set:B.prototype.ju});B.prototype.get_maxForce=B.prototype.tu=function(){return Vg(this.Ut)};B.prototype.set_maxForce=B.prototype.xu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Wg(c,b)};
Object.defineProperty(B.prototype,"maxForce",{get:B.prototype.tu,set:B.prototype.xu});B.prototype.get_maxTorque=B.prototype.Iu=function(){return Xg(this.Ut)};B.prototype.set_maxTorque=B.prototype.Xu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Yg(c,b)};Object.defineProperty(B.prototype,"maxTorque",{get:B.prototype.Iu,set:B.prototype.Xu});B.prototype.get_type=B.prototype.Xt=function(){return Zg(this.Ut)};
B.prototype.set_type=B.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);$g(c,b)};Object.defineProperty(B.prototype,"type",{get:B.prototype.Xt,set:B.prototype.Zt});B.prototype.get_userData=B.prototype.Yt=function(){return ah(this.Ut)};B.prototype.set_userData=B.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);bh(c,b)};Object.defineProperty(B.prototype,"userData",{get:B.prototype.Yt,set:B.prototype.$t});
B.prototype.get_bodyA=B.prototype.au=function(){return h(ch(this.Ut),l)};B.prototype.set_bodyA=B.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);dh(c,b)};Object.defineProperty(B.prototype,"bodyA",{get:B.prototype.au,set:B.prototype.du});B.prototype.get_bodyB=B.prototype.bu=function(){return h(eh(this.Ut),l)};B.prototype.set_bodyB=B.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);fh(c,b)};
Object.defineProperty(B.prototype,"bodyB",{get:B.prototype.bu,set:B.prototype.eu});B.prototype.get_collideConnected=B.prototype.cu=function(){return!!gh(this.Ut)};B.prototype.set_collideConnected=B.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);hh(c,b)};Object.defineProperty(B.prototype,"collideConnected",{get:B.prototype.cu,set:B.prototype.fu});B.prototype.__destroy__=function(){ih(this.Ut)};function C(){this.Ut=jh();g(C)[this.Ut]=this}C.prototype=Object.create(e.prototype);
C.prototype.constructor=C;C.prototype.Vt=C;C.Wt={};a.b2Manifold=C;C.prototype.get_localNormal=C.prototype.Xv=function(){return h(kh(this.Ut),m)};C.prototype.set_localNormal=C.prototype.Kx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);lh(c,b)};Object.defineProperty(C.prototype,"localNormal",{get:C.prototype.Xv,set:C.prototype.Kx});C.prototype.get_localPoint=C.prototype.Fu=function(){return h(mh(this.Ut),m)};
C.prototype.set_localPoint=C.prototype.Uu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);nh(c,b)};Object.defineProperty(C.prototype,"localPoint",{get:C.prototype.Fu,set:C.prototype.Uu});C.prototype.get_type=C.prototype.Xt=function(){return oh(this.Ut)};C.prototype.set_type=C.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ph(c,b)};Object.defineProperty(C.prototype,"type",{get:C.prototype.Xt,set:C.prototype.Zt});C.prototype.get_pointCount=C.prototype.ww=function(){return qh(this.Ut)};
C.prototype.set_pointCount=C.prototype.jy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);rh(c,b)};Object.defineProperty(C.prototype,"pointCount",{get:C.prototype.ww,set:C.prototype.jy});C.prototype.__destroy__=function(){sh(this.Ut)};function D(){this.Ut=th();g(D)[this.Ut]=this}D.prototype=Object.create(e.prototype);D.prototype.constructor=D;D.prototype.Vt=D;D.Wt={};a.b2WorldManifold=D;
D.prototype.Initialize=function(b,c,d,f,y){var oa=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);y&&"object"===typeof y&&(y=y.Ut);uh(oa,b,c,d,f,y)};D.prototype.get_normal=D.prototype.Ku=function(){return h(vh(this.Ut),m)};D.prototype.set_normal=D.prototype.Zu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wh(c,b)};Object.defineProperty(D.prototype,"normal",{get:D.prototype.Ku,set:D.prototype.Zu});
D.prototype.get_points=D.prototype.xw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(xh(c,b),m)};D.prototype.set_points=D.prototype.ky=function(b,c){var d=this.Ut;sw();b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);yh(d,b,c)};Object.defineProperty(D.prototype,"points",{get:D.prototype.xw,set:D.prototype.ky});D.prototype.get_separations=D.prototype.Dw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return zh(c,b)};
D.prototype.set_separations=D.prototype.qy=function(b,c){var d=this.Ut;sw();b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Ah(d,b,c)};Object.defineProperty(D.prototype,"separations",{get:D.prototype.Dw,set:D.prototype.qy});D.prototype.__destroy__=function(){Bh(this.Ut)};function E(){this.Ut=Ch();g(E)[this.Ut]=this}E.prototype=Object.create(n.prototype);E.prototype.constructor=E;E.prototype.Vt=E;E.Wt={};a.b2PrismaticJointDef=E;
E.prototype.Initialize=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);Dh(y,b,c,d,f)};E.prototype.get_localAnchorA=E.prototype.gu=function(){return h(Eh(this.Ut),m)};E.prototype.set_localAnchorA=E.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Fh(c,b)};Object.defineProperty(E.prototype,"localAnchorA",{get:E.prototype.gu,set:E.prototype.iu});
E.prototype.get_localAnchorB=E.prototype.hu=function(){return h(Gh(this.Ut),m)};E.prototype.set_localAnchorB=E.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Hh(c,b)};Object.defineProperty(E.prototype,"localAnchorB",{get:E.prototype.hu,set:E.prototype.ju});E.prototype.get_localAxisA=E.prototype.Eu=function(){return h(Ih(this.Ut),m)};E.prototype.set_localAxisA=E.prototype.Tu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Jh(c,b)};
Object.defineProperty(E.prototype,"localAxisA",{get:E.prototype.Eu,set:E.prototype.Tu});E.prototype.get_referenceAngle=E.prototype.vu=function(){return Kh(this.Ut)};E.prototype.set_referenceAngle=E.prototype.zu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lh(c,b)};Object.defineProperty(E.prototype,"referenceAngle",{get:E.prototype.vu,set:E.prototype.zu});E.prototype.get_enableLimit=E.prototype.Bu=function(){return!!Mh(this.Ut)};
E.prototype.set_enableLimit=E.prototype.Qu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Nh(c,b)};Object.defineProperty(E.prototype,"enableLimit",{get:E.prototype.Bu,set:E.prototype.Qu});E.prototype.get_lowerTranslation=E.prototype.$v=function(){return Oh(this.Ut)};E.prototype.set_lowerTranslation=E.prototype.Nx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ph(c,b)};Object.defineProperty(E.prototype,"lowerTranslation",{get:E.prototype.$v,set:E.prototype.Nx});
E.prototype.get_upperTranslation=E.prototype.Rw=function(){return Qh(this.Ut)};E.prototype.set_upperTranslation=E.prototype.Ey=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Rh(c,b)};Object.defineProperty(E.prototype,"upperTranslation",{get:E.prototype.Rw,set:E.prototype.Ey});E.prototype.get_enableMotor=E.prototype.su=function(){return!!Sh(this.Ut)};E.prototype.set_enableMotor=E.prototype.wu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Th(c,b)};
Object.defineProperty(E.prototype,"enableMotor",{get:E.prototype.su,set:E.prototype.wu});E.prototype.get_maxMotorForce=E.prototype.rw=function(){return Uh(this.Ut)};E.prototype.set_maxMotorForce=E.prototype.ey=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Vh(c,b)};Object.defineProperty(E.prototype,"maxMotorForce",{get:E.prototype.rw,set:E.prototype.ey});E.prototype.get_motorSpeed=E.prototype.uu=function(){return Wh(this.Ut)};
E.prototype.set_motorSpeed=E.prototype.yu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xh(c,b)};Object.defineProperty(E.prototype,"motorSpeed",{get:E.prototype.uu,set:E.prototype.yu});E.prototype.get_type=E.prototype.Xt=function(){return Yh(this.Ut)};E.prototype.set_type=E.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zh(c,b)};Object.defineProperty(E.prototype,"type",{get:E.prototype.Xt,set:E.prototype.Zt});E.prototype.get_userData=E.prototype.Yt=function(){return $h(this.Ut)};
E.prototype.set_userData=E.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ai(c,b)};Object.defineProperty(E.prototype,"userData",{get:E.prototype.Yt,set:E.prototype.$t});E.prototype.get_bodyA=E.prototype.au=function(){return h(bi(this.Ut),l)};E.prototype.set_bodyA=E.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ci(c,b)};Object.defineProperty(E.prototype,"bodyA",{get:E.prototype.au,set:E.prototype.du});
E.prototype.get_bodyB=E.prototype.bu=function(){return h(di(this.Ut),l)};E.prototype.set_bodyB=E.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ei(c,b)};Object.defineProperty(E.prototype,"bodyB",{get:E.prototype.bu,set:E.prototype.eu});E.prototype.get_collideConnected=E.prototype.cu=function(){return!!fi(this.Ut)};E.prototype.set_collideConnected=E.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);gi(c,b)};
Object.defineProperty(E.prototype,"collideConnected",{get:E.prototype.cu,set:E.prototype.fu});E.prototype.__destroy__=function(){hi(this.Ut)};function F(b){b&&"object"===typeof b&&(b=b.Ut);this.Ut=ii(b);g(F)[this.Ut]=this}F.prototype=Object.create(e.prototype);F.prototype.constructor=F;F.prototype.Vt=F;F.Wt={};a.b2World=F;F.prototype.SetDestructionListener=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ji(c,b)};
F.prototype.SetContactFilter=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ki(c,b)};F.prototype.SetContactListener=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);li(c,b)};F.prototype.SetDebugDraw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);mi(c,b)};F.prototype.CreateBody=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(ni(c,b),l)};F.prototype.DestroyBody=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);oi(c,b)};
F.prototype.CreateJoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(pi(c,b),k)};F.prototype.DestroyJoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);qi(c,b)};F.prototype.Step=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);ri(f,b,c,d)};F.prototype.ClearForces=function(){si(this.Ut)};F.prototype.DrawDebugData=function(){ti(this.Ut)};
F.prototype.QueryAABB=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);ui(d,b,c)};F.prototype.RayCast=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);vi(f,b,c,d)};F.prototype.GetBodyList=function(){return h(wi(this.Ut),l)};F.prototype.GetJointList=function(){return h(xi(this.Ut),k)};F.prototype.GetContactList=function(){return h(yi(this.Ut),Iw)};
F.prototype.SetAllowSleeping=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);zi(c,b)};F.prototype.GetAllowSleeping=function(){return!!Ai(this.Ut)};F.prototype.SetWarmStarting=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Bi(c,b)};F.prototype.GetWarmStarting=function(){return!!Ci(this.Ut)};F.prototype.SetContinuousPhysics=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Di(c,b)};F.prototype.GetContinuousPhysics=function(){return!!Ei(this.Ut)};
F.prototype.SetSubStepping=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Fi(c,b)};F.prototype.GetSubStepping=function(){return!!Gi(this.Ut)};F.prototype.GetProxyCount=function(){return Hi(this.Ut)};F.prototype.GetBodyCount=function(){return Ii(this.Ut)};F.prototype.GetJointCount=function(){return Ji(this.Ut)};F.prototype.GetContactCount=function(){return Ki(this.Ut)};F.prototype.GetTreeHeight=function(){return Li(this.Ut)};F.prototype.GetTreeBalance=function(){return Mi(this.Ut)};
F.prototype.GetTreeQuality=function(){return Ni(this.Ut)};F.prototype.SetGravity=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Oi(c,b)};F.prototype.GetGravity=function(){return h(Pi(this.Ut),m)};F.prototype.IsLocked=function(){return!!Qi(this.Ut)};F.prototype.SetAutoClearForces=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ri(c,b)};F.prototype.GetAutoClearForces=function(){return!!Si(this.Ut)};F.prototype.GetProfile=function(){return h(Ti(this.Ut),w)};F.prototype.Dump=function(){Ui(this.Ut)};
F.prototype.__destroy__=function(){Vi(this.Ut)};function G(){throw"cannot construct a b2PrismaticJoint, no constructor in IDL";}G.prototype=Object.create(k.prototype);G.prototype.constructor=G;G.prototype.Vt=G;G.Wt={};a.b2PrismaticJoint=G;G.prototype.GetLocalAnchorA=function(){return h(Wi(this.Ut),m)};G.prototype.GetLocalAnchorB=function(){return h(Xi(this.Ut),m)};G.prototype.GetLocalAxisA=function(){return h(Yi(this.Ut),m)};G.prototype.GetReferenceAngle=function(){return Zi(this.Ut)};
G.prototype.GetJointTranslation=function(){return $i(this.Ut)};G.prototype.GetJointSpeed=function(){return aj(this.Ut)};G.prototype.IsLimitEnabled=function(){return!!bj(this.Ut)};G.prototype.EnableLimit=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);cj(c,b)};G.prototype.GetLowerLimit=function(){return dj(this.Ut)};G.prototype.GetUpperLimit=function(){return ej(this.Ut)};
G.prototype.SetLimits=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);fj(d,b,c)};G.prototype.IsMotorEnabled=function(){return!!gj(this.Ut)};G.prototype.EnableMotor=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);hj(c,b)};G.prototype.SetMotorSpeed=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ij(c,b)};G.prototype.GetMotorSpeed=function(){return jj(this.Ut)};
G.prototype.SetMaxMotorForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);kj(c,b)};G.prototype.GetMaxMotorForce=function(){return lj(this.Ut)};G.prototype.GetMotorForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return mj(c,b)};G.prototype.GetType=function(){return nj(this.Ut)};G.prototype.GetBodyA=function(){return h(oj(this.Ut),l)};G.prototype.GetBodyB=function(){return h(pj(this.Ut),l)};G.prototype.GetAnchorA=function(){return h(qj(this.Ut),m)};
G.prototype.GetAnchorB=function(){return h(rj(this.Ut),m)};G.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(sj(c,b),m)};G.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return tj(c,b)};G.prototype.GetNext=function(){return h(uj(this.Ut),k)};G.prototype.GetUserData=function(){return vj(this.Ut)};G.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wj(c,b)};G.prototype.IsActive=function(){return!!xj(this.Ut)};
G.prototype.GetCollideConnected=function(){return!!yj(this.Ut)};G.prototype.__destroy__=function(){zj(this.Ut)};function Jw(){throw"cannot construct a b2RayCastOutput, no constructor in IDL";}Jw.prototype=Object.create(e.prototype);Jw.prototype.constructor=Jw;Jw.prototype.Vt=Jw;Jw.Wt={};a.b2RayCastOutput=Jw;Jw.prototype.get_normal=Jw.prototype.Ku=function(){return h(Aj(this.Ut),m)};Jw.prototype.set_normal=Jw.prototype.Zu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Bj(c,b)};
Object.defineProperty(Jw.prototype,"normal",{get:Jw.prototype.Ku,set:Jw.prototype.Zu});Jw.prototype.get_fraction=Jw.prototype.Cv=function(){return Cj(this.Ut)};Jw.prototype.set_fraction=Jw.prototype.px=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Dj(c,b)};Object.defineProperty(Jw.prototype,"fraction",{get:Jw.prototype.Cv,set:Jw.prototype.px});Jw.prototype.__destroy__=function(){Ej(this.Ut)};function Kw(){throw"cannot construct a b2ContactID, no constructor in IDL";}Kw.prototype=Object.create(e.prototype);
Kw.prototype.constructor=Kw;Kw.prototype.Vt=Kw;Kw.Wt={};a.b2ContactID=Kw;Kw.prototype.get_cf=Kw.prototype.tv=function(){return h(Fj(this.Ut),z)};Kw.prototype.set_cf=Kw.prototype.gx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Gj(c,b)};Object.defineProperty(Kw.prototype,"cf",{get:Kw.prototype.tv,set:Kw.prototype.gx});Kw.prototype.get_key=Kw.prototype.Qv=function(){return Hj(this.Ut)};
Kw.prototype.set_key=Kw.prototype.Dx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ij(c,b)};Object.defineProperty(Kw.prototype,"key",{get:Kw.prototype.Qv,set:Kw.prototype.Dx});Kw.prototype.__destroy__=function(){Jj(this.Ut)};function Lw(){this.Ut=Kj();g(Lw)[this.Ut]=this}Lw.prototype=Object.create(ww.prototype);Lw.prototype.constructor=Lw;Lw.prototype.Vt=Lw;Lw.Wt={};a.JSContactListener=Lw;Lw.prototype.BeginContact=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lj(c,b)};
Lw.prototype.EndContact=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Mj(c,b)};Lw.prototype.PreSolve=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Nj(d,b,c)};Lw.prototype.PostSolve=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Oj(d,b,c)};Lw.prototype.__destroy__=function(){Pj(this.Ut)};
function Mw(b,c,d,f){b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);this.Ut=void 0===b?Qj():void 0===c?_emscripten_bind_b2Mat22_b2Mat22_1(b):void 0===d?Rj(b,c):void 0===f?_emscripten_bind_b2Mat22_b2Mat22_3(b,c,d):Sj(b,c,d,f);g(Mw)[this.Ut]=this}Mw.prototype=Object.create(e.prototype);Mw.prototype.constructor=Mw;Mw.prototype.Vt=Mw;Mw.Wt={};a.b2Mat22=Mw;
Mw.prototype.Set=Mw.prototype.Set=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Tj(d,b,c)};Mw.prototype.SetIdentity=function(){Uj(this.Ut)};Mw.prototype.SetZero=function(){Vj(this.Ut)};Mw.prototype.GetInverse=function(){return h(Wj(this.Ut),Mw)};Mw.prototype.Solve=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Xj(c,b),m)};Mw.prototype.get_ex=Mw.prototype.Cu=function(){return h(Yj(this.Ut),m)};
Mw.prototype.set_ex=Mw.prototype.Ru=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zj(c,b)};Object.defineProperty(Mw.prototype,"ex",{get:Mw.prototype.Cu,set:Mw.prototype.Ru});Mw.prototype.get_ey=Mw.prototype.Du=function(){return h(ak(this.Ut),m)};Mw.prototype.set_ey=Mw.prototype.Su=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);bk(c,b)};Object.defineProperty(Mw.prototype,"ey",{get:Mw.prototype.Du,set:Mw.prototype.Su});Mw.prototype.__destroy__=function(){ck(this.Ut)};
function H(){this.Ut=dk();g(H)[this.Ut]=this}H.prototype=Object.create(n.prototype);H.prototype.constructor=H;H.prototype.Vt=H;H.Wt={};a.b2WheelJointDef=H;H.prototype.Initialize=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);ek(y,b,c,d,f)};H.prototype.get_localAnchorA=H.prototype.gu=function(){return h(fk(this.Ut),m)};
H.prototype.set_localAnchorA=H.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);gk(c,b)};Object.defineProperty(H.prototype,"localAnchorA",{get:H.prototype.gu,set:H.prototype.iu});H.prototype.get_localAnchorB=H.prototype.hu=function(){return h(hk(this.Ut),m)};H.prototype.set_localAnchorB=H.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ik(c,b)};Object.defineProperty(H.prototype,"localAnchorB",{get:H.prototype.hu,set:H.prototype.ju});
H.prototype.get_localAxisA=H.prototype.Eu=function(){return h(jk(this.Ut),m)};H.prototype.set_localAxisA=H.prototype.Tu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);kk(c,b)};Object.defineProperty(H.prototype,"localAxisA",{get:H.prototype.Eu,set:H.prototype.Tu});H.prototype.get_enableMotor=H.prototype.su=function(){return!!lk(this.Ut)};H.prototype.set_enableMotor=H.prototype.wu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);mk(c,b)};
Object.defineProperty(H.prototype,"enableMotor",{get:H.prototype.su,set:H.prototype.wu});H.prototype.get_maxMotorTorque=H.prototype.Hu=function(){return nk(this.Ut)};H.prototype.set_maxMotorTorque=H.prototype.Wu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ok(c,b)};Object.defineProperty(H.prototype,"maxMotorTorque",{get:H.prototype.Hu,set:H.prototype.Wu});H.prototype.get_motorSpeed=H.prototype.uu=function(){return pk(this.Ut)};
H.prototype.set_motorSpeed=H.prototype.yu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);qk(c,b)};Object.defineProperty(H.prototype,"motorSpeed",{get:H.prototype.uu,set:H.prototype.yu});H.prototype.get_frequencyHz=H.prototype.pu=function(){return rk(this.Ut)};H.prototype.set_frequencyHz=H.prototype.ru=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);sk(c,b)};Object.defineProperty(H.prototype,"frequencyHz",{get:H.prototype.pu,set:H.prototype.ru});
H.prototype.get_dampingRatio=H.prototype.ou=function(){return tk(this.Ut)};H.prototype.set_dampingRatio=H.prototype.qu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);uk(c,b)};Object.defineProperty(H.prototype,"dampingRatio",{get:H.prototype.ou,set:H.prototype.qu});H.prototype.get_type=H.prototype.Xt=function(){return vk(this.Ut)};H.prototype.set_type=H.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wk(c,b)};
Object.defineProperty(H.prototype,"type",{get:H.prototype.Xt,set:H.prototype.Zt});H.prototype.get_userData=H.prototype.Yt=function(){return xk(this.Ut)};H.prototype.set_userData=H.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);yk(c,b)};Object.defineProperty(H.prototype,"userData",{get:H.prototype.Yt,set:H.prototype.$t});H.prototype.get_bodyA=H.prototype.au=function(){return h(zk(this.Ut),l)};
H.prototype.set_bodyA=H.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ak(c,b)};Object.defineProperty(H.prototype,"bodyA",{get:H.prototype.au,set:H.prototype.du});H.prototype.get_bodyB=H.prototype.bu=function(){return h(Bk(this.Ut),l)};H.prototype.set_bodyB=H.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ck(c,b)};Object.defineProperty(H.prototype,"bodyB",{get:H.prototype.bu,set:H.prototype.eu});H.prototype.get_collideConnected=H.prototype.cu=function(){return!!Dk(this.Ut)};
H.prototype.set_collideConnected=H.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ek(c,b)};Object.defineProperty(H.prototype,"collideConnected",{get:H.prototype.cu,set:H.prototype.fu});H.prototype.__destroy__=function(){Fk(this.Ut)};function I(){this.Ut=Gk();g(I)[this.Ut]=this}I.prototype=Object.create(p.prototype);I.prototype.constructor=I;I.prototype.Vt=I;I.Wt={};a.b2CircleShape=I;I.prototype.GetType=function(){return Hk(this.Ut)};I.prototype.GetChildCount=function(){return Ik(this.Ut)};
I.prototype.TestPoint=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return!!Jk(d,b,c)};I.prototype.RayCast=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);return!!Kk(y,b,c,d,f)};
I.prototype.ComputeAABB=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Lk(f,b,c,d)};I.prototype.ComputeMass=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Mk(d,b,c)};I.prototype.get_m_p=I.prototype.gw=function(){return h(Nk(this.Ut),m)};I.prototype.set_m_p=I.prototype.Ux=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ok(c,b)};
Object.defineProperty(I.prototype,"m_p",{get:I.prototype.gw,set:I.prototype.Ux});I.prototype.get_m_type=I.prototype.lu=function(){return Pk(this.Ut)};I.prototype.set_m_type=I.prototype.nu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Qk(c,b)};Object.defineProperty(I.prototype,"m_type",{get:I.prototype.lu,set:I.prototype.nu});I.prototype.get_m_radius=I.prototype.ku=function(){return Rk(this.Ut)};
I.prototype.set_m_radius=I.prototype.mu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Sk(c,b)};Object.defineProperty(I.prototype,"m_radius",{get:I.prototype.ku,set:I.prototype.mu});I.prototype.__destroy__=function(){Tk(this.Ut)};function J(){this.Ut=Uk();g(J)[this.Ut]=this}J.prototype=Object.create(n.prototype);J.prototype.constructor=J;J.prototype.Vt=J;J.Wt={};a.b2WeldJointDef=J;
J.prototype.Initialize=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Vk(f,b,c,d)};J.prototype.get_localAnchorA=J.prototype.gu=function(){return h(Wk(this.Ut),m)};J.prototype.set_localAnchorA=J.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xk(c,b)};Object.defineProperty(J.prototype,"localAnchorA",{get:J.prototype.gu,set:J.prototype.iu});
J.prototype.get_localAnchorB=J.prototype.hu=function(){return h(Yk(this.Ut),m)};J.prototype.set_localAnchorB=J.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zk(c,b)};Object.defineProperty(J.prototype,"localAnchorB",{get:J.prototype.hu,set:J.prototype.ju});J.prototype.get_referenceAngle=J.prototype.vu=function(){return $k(this.Ut)};J.prototype.set_referenceAngle=J.prototype.zu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);al(c,b)};
Object.defineProperty(J.prototype,"referenceAngle",{get:J.prototype.vu,set:J.prototype.zu});J.prototype.get_frequencyHz=J.prototype.pu=function(){return bl(this.Ut)};J.prototype.set_frequencyHz=J.prototype.ru=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);cl(c,b)};Object.defineProperty(J.prototype,"frequencyHz",{get:J.prototype.pu,set:J.prototype.ru});J.prototype.get_dampingRatio=J.prototype.ou=function(){return dl(this.Ut)};
J.prototype.set_dampingRatio=J.prototype.qu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);el(c,b)};Object.defineProperty(J.prototype,"dampingRatio",{get:J.prototype.ou,set:J.prototype.qu});J.prototype.get_type=J.prototype.Xt=function(){return fl(this.Ut)};J.prototype.set_type=J.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);gl(c,b)};Object.defineProperty(J.prototype,"type",{get:J.prototype.Xt,set:J.prototype.Zt});J.prototype.get_userData=J.prototype.Yt=function(){return hl(this.Ut)};
J.prototype.set_userData=J.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);il(c,b)};Object.defineProperty(J.prototype,"userData",{get:J.prototype.Yt,set:J.prototype.$t});J.prototype.get_bodyA=J.prototype.au=function(){return h(jl(this.Ut),l)};J.prototype.set_bodyA=J.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);kl(c,b)};Object.defineProperty(J.prototype,"bodyA",{get:J.prototype.au,set:J.prototype.du});
J.prototype.get_bodyB=J.prototype.bu=function(){return h(ll(this.Ut),l)};J.prototype.set_bodyB=J.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ml(c,b)};Object.defineProperty(J.prototype,"bodyB",{get:J.prototype.bu,set:J.prototype.eu});J.prototype.get_collideConnected=J.prototype.cu=function(){return!!nl(this.Ut)};J.prototype.set_collideConnected=J.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ol(c,b)};
Object.defineProperty(J.prototype,"collideConnected",{get:J.prototype.cu,set:J.prototype.fu});J.prototype.__destroy__=function(){pl(this.Ut)};function Nw(){this.Ut=ql();g(Nw)[this.Ut]=this}Nw.prototype=Object.create(e.prototype);Nw.prototype.constructor=Nw;Nw.prototype.Vt=Nw;Nw.Wt={};a.b2MassData=Nw;Nw.prototype.get_mass=Nw.prototype.ow=function(){return rl(this.Ut)};Nw.prototype.set_mass=Nw.prototype.by=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);sl(c,b)};
Object.defineProperty(Nw.prototype,"mass",{get:Nw.prototype.ow,set:Nw.prototype.by});Nw.prototype.get_center=Nw.prototype.sv=function(){return h(tl(this.Ut),m)};Nw.prototype.set_center=Nw.prototype.fx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ul(c,b)};Object.defineProperty(Nw.prototype,"center",{get:Nw.prototype.sv,set:Nw.prototype.fx});Nw.prototype.get_I=Nw.prototype.fv=function(){return vl(this.Ut)};
Nw.prototype.set_I=Nw.prototype.Tw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wl(c,b)};Object.defineProperty(Nw.prototype,"I",{get:Nw.prototype.fv,set:Nw.prototype.Tw});Nw.prototype.__destroy__=function(){xl(this.Ut)};function Ow(){throw"cannot construct a b2GearJoint, no constructor in IDL";}Ow.prototype=Object.create(k.prototype);Ow.prototype.constructor=Ow;Ow.prototype.Vt=Ow;Ow.Wt={};a.b2GearJoint=Ow;Ow.prototype.GetJoint1=function(){return h(yl(this.Ut),k)};
Ow.prototype.GetJoint2=function(){return h(zl(this.Ut),k)};Ow.prototype.SetRatio=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Al(c,b)};Ow.prototype.GetRatio=function(){return Bl(this.Ut)};Ow.prototype.GetType=function(){return Cl(this.Ut)};Ow.prototype.GetBodyA=function(){return h(Dl(this.Ut),l)};Ow.prototype.GetBodyB=function(){return h(El(this.Ut),l)};Ow.prototype.GetAnchorA=function(){return h(Fl(this.Ut),m)};Ow.prototype.GetAnchorB=function(){return h(Gl(this.Ut),m)};
Ow.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Hl(c,b),m)};Ow.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return Il(c,b)};Ow.prototype.GetNext=function(){return h(Jl(this.Ut),k)};Ow.prototype.GetUserData=function(){return Kl(this.Ut)};Ow.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ll(c,b)};Ow.prototype.IsActive=function(){return!!Ml(this.Ut)};
Ow.prototype.GetCollideConnected=function(){return!!Nl(this.Ut)};Ow.prototype.__destroy__=function(){Ol(this.Ut)};function Pw(){throw"cannot construct a b2WeldJoint, no constructor in IDL";}Pw.prototype=Object.create(k.prototype);Pw.prototype.constructor=Pw;Pw.prototype.Vt=Pw;Pw.Wt={};a.b2WeldJoint=Pw;Pw.prototype.GetLocalAnchorA=function(){return h(Pl(this.Ut),m)};Pw.prototype.GetLocalAnchorB=function(){return h(Ql(this.Ut),m)};
Pw.prototype.SetFrequency=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Rl(c,b)};Pw.prototype.GetFrequency=function(){return Sl(this.Ut)};Pw.prototype.SetDampingRatio=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Tl(c,b)};Pw.prototype.GetDampingRatio=function(){return Ul(this.Ut)};Pw.prototype.Dump=function(){Vl(this.Ut)};Pw.prototype.GetType=function(){return Wl(this.Ut)};Pw.prototype.GetBodyA=function(){return h(Xl(this.Ut),l)};
Pw.prototype.GetBodyB=function(){return h(Yl(this.Ut),l)};Pw.prototype.GetAnchorA=function(){return h(Zl(this.Ut),m)};Pw.prototype.GetAnchorB=function(){return h($l(this.Ut),m)};Pw.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(am(c,b),m)};Pw.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return bm(c,b)};Pw.prototype.GetNext=function(){return h(cm(this.Ut),k)};Pw.prototype.GetUserData=function(){return dm(this.Ut)};
Pw.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);em(c,b)};Pw.prototype.IsActive=function(){return!!fm(this.Ut)};Pw.prototype.GetCollideConnected=function(){return!!gm(this.Ut)};Pw.prototype.__destroy__=function(){hm(this.Ut)};function K(){this.Ut=im();g(K)[this.Ut]=this}K.prototype=Object.create(e.prototype);K.prototype.constructor=K;K.prototype.Vt=K;K.Wt={};a.b2JointEdge=K;K.prototype.get_other=K.prototype.Lu=function(){return h(jm(this.Ut),l)};
K.prototype.set_other=K.prototype.$u=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);km(c,b)};Object.defineProperty(K.prototype,"other",{get:K.prototype.Lu,set:K.prototype.$u});K.prototype.get_joint=K.prototype.Nv=function(){return h(lm(this.Ut),k)};K.prototype.set_joint=K.prototype.Ax=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);mm(c,b)};Object.defineProperty(K.prototype,"joint",{get:K.prototype.Nv,set:K.prototype.Ax});
K.prototype.get_prev=K.prototype.Mu=function(){return h(nm(this.Ut),K)};K.prototype.set_prev=K.prototype.av=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);om(c,b)};Object.defineProperty(K.prototype,"prev",{get:K.prototype.Mu,set:K.prototype.av});K.prototype.get_next=K.prototype.Ju=function(){return h(pm(this.Ut),K)};K.prototype.set_next=K.prototype.Yu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);qm(c,b)};Object.defineProperty(K.prototype,"next",{get:K.prototype.Ju,set:K.prototype.Yu});
K.prototype.__destroy__=function(){rm(this.Ut)};function L(){this.Ut=sm();g(L)[this.Ut]=this}L.prototype=Object.create(n.prototype);L.prototype.constructor=L;L.prototype.Vt=L;L.Wt={};a.b2PulleyJointDef=L;
L.prototype.Initialize=function(b,c,d,f,y,oa,ya){var ab=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);y&&"object"===typeof y&&(y=y.Ut);oa&&"object"===typeof oa&&(oa=oa.Ut);ya&&"object"===typeof ya&&(ya=ya.Ut);tm(ab,b,c,d,f,y,oa,ya)};L.prototype.get_groundAnchorA=L.prototype.Gv=function(){return h(um(this.Ut),m)};
L.prototype.set_groundAnchorA=L.prototype.tx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wm(c,b)};Object.defineProperty(L.prototype,"groundAnchorA",{get:L.prototype.Gv,set:L.prototype.tx});L.prototype.get_groundAnchorB=L.prototype.Hv=function(){return h(xm(this.Ut),m)};L.prototype.set_groundAnchorB=L.prototype.ux=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ym(c,b)};Object.defineProperty(L.prototype,"groundAnchorB",{get:L.prototype.Hv,set:L.prototype.ux});
L.prototype.get_localAnchorA=L.prototype.gu=function(){return h(zm(this.Ut),m)};L.prototype.set_localAnchorA=L.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Am(c,b)};Object.defineProperty(L.prototype,"localAnchorA",{get:L.prototype.gu,set:L.prototype.iu});L.prototype.get_localAnchorB=L.prototype.hu=function(){return h(Bm(this.Ut),m)};L.prototype.set_localAnchorB=L.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Cm(c,b)};
Object.defineProperty(L.prototype,"localAnchorB",{get:L.prototype.hu,set:L.prototype.ju});L.prototype.get_lengthA=L.prototype.Sv=function(){return Dm(this.Ut)};L.prototype.set_lengthA=L.prototype.Fx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Em(c,b)};Object.defineProperty(L.prototype,"lengthA",{get:L.prototype.Sv,set:L.prototype.Fx});L.prototype.get_lengthB=L.prototype.Tv=function(){return Fm(this.Ut)};
L.prototype.set_lengthB=L.prototype.Gx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Gm(c,b)};Object.defineProperty(L.prototype,"lengthB",{get:L.prototype.Tv,set:L.prototype.Gx});L.prototype.get_ratio=L.prototype.Nu=function(){return Hm(this.Ut)};L.prototype.set_ratio=L.prototype.bv=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Im(c,b)};Object.defineProperty(L.prototype,"ratio",{get:L.prototype.Nu,set:L.prototype.bv});L.prototype.get_type=L.prototype.Xt=function(){return Jm(this.Ut)};
L.prototype.set_type=L.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Km(c,b)};Object.defineProperty(L.prototype,"type",{get:L.prototype.Xt,set:L.prototype.Zt});L.prototype.get_userData=L.prototype.Yt=function(){return Lm(this.Ut)};L.prototype.set_userData=L.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Mm(c,b)};Object.defineProperty(L.prototype,"userData",{get:L.prototype.Yt,set:L.prototype.$t});
L.prototype.get_bodyA=L.prototype.au=function(){return h(Nm(this.Ut),l)};L.prototype.set_bodyA=L.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Om(c,b)};Object.defineProperty(L.prototype,"bodyA",{get:L.prototype.au,set:L.prototype.du});L.prototype.get_bodyB=L.prototype.bu=function(){return h(Pm(this.Ut),l)};L.prototype.set_bodyB=L.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Qm(c,b)};
Object.defineProperty(L.prototype,"bodyB",{get:L.prototype.bu,set:L.prototype.eu});L.prototype.get_collideConnected=L.prototype.cu=function(){return!!Rm(this.Ut)};L.prototype.set_collideConnected=L.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Sm(c,b)};Object.defineProperty(L.prototype,"collideConnected",{get:L.prototype.cu,set:L.prototype.fu});L.prototype.__destroy__=function(){Tm(this.Ut)};function M(){this.Ut=Um();g(M)[this.Ut]=this}M.prototype=Object.create(e.prototype);
M.prototype.constructor=M;M.prototype.Vt=M;M.Wt={};a.b2ManifoldPoint=M;M.prototype.get_localPoint=M.prototype.Fu=function(){return h(Vm(this.Ut),m)};M.prototype.set_localPoint=M.prototype.Uu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Wm(c,b)};Object.defineProperty(M.prototype,"localPoint",{get:M.prototype.Fu,set:M.prototype.Uu});M.prototype.get_normalImpulse=M.prototype.sw=function(){return Xm(this.Ut)};
M.prototype.set_normalImpulse=M.prototype.fy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ym(c,b)};Object.defineProperty(M.prototype,"normalImpulse",{get:M.prototype.sw,set:M.prototype.fy});M.prototype.get_tangentImpulse=M.prototype.Lw=function(){return Zm(this.Ut)};M.prototype.set_tangentImpulse=M.prototype.yy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);$m(c,b)};Object.defineProperty(M.prototype,"tangentImpulse",{get:M.prototype.Lw,set:M.prototype.yy});
M.prototype.get_id=M.prototype.Jv=function(){return h(an(this.Ut),Kw)};M.prototype.set_id=M.prototype.wx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);bn(c,b)};Object.defineProperty(M.prototype,"id",{get:M.prototype.Jv,set:M.prototype.wx});M.prototype.__destroy__=function(){cn(this.Ut)};function Qw(b,c){b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);this.Ut=void 0===b?dn():void 0===c?_emscripten_bind_b2Transform_b2Transform_1(b):en(b,c);g(Qw)[this.Ut]=this}
Qw.prototype=Object.create(e.prototype);Qw.prototype.constructor=Qw;Qw.prototype.Vt=Qw;Qw.Wt={};a.b2Transform=Qw;Qw.prototype.SetIdentity=function(){fn(this.Ut)};Qw.prototype.Set=Qw.prototype.Set=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);gn(d,b,c)};Qw.prototype.get_p=Qw.prototype.tw=function(){return h(hn(this.Ut),m)};Qw.prototype.set_p=Qw.prototype.gy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);jn(c,b)};
Object.defineProperty(Qw.prototype,"p",{get:Qw.prototype.tw,set:Qw.prototype.gy});Qw.prototype.get_q=Qw.prototype.zw=function(){return h(kn(this.Ut),Ew)};Qw.prototype.set_q=Qw.prototype.my=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ln(c,b)};Object.defineProperty(Qw.prototype,"q",{get:Qw.prototype.zw,set:Qw.prototype.my});Qw.prototype.__destroy__=function(){mn(this.Ut)};function N(){this.Ut=nn();g(N)[this.Ut]=this}N.prototype=Object.create(p.prototype);N.prototype.constructor=N;
N.prototype.Vt=N;N.Wt={};a.b2ChainShape=N;N.prototype.Clear=function(){on(this.Ut)};N.prototype.CreateLoop=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);pn(d,b,c)};N.prototype.CreateChain=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);qn(d,b,c)};N.prototype.SetPrevVertex=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);rn(c,b)};
N.prototype.SetNextVertex=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);sn(c,b)};N.prototype.GetChildEdge=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);tn(d,b,c)};N.prototype.GetType=function(){return un(this.Ut)};N.prototype.GetChildCount=function(){return vn(this.Ut)};N.prototype.TestPoint=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return!!wn(d,b,c)};
N.prototype.RayCast=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);return!!xn(y,b,c,d,f)};N.prototype.ComputeAABB=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);yn(f,b,c,d)};N.prototype.ComputeMass=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);zn(d,b,c)};
N.prototype.get_m_vertices=N.prototype.mw=function(){return h(An(this.Ut),m)};N.prototype.set_m_vertices=N.prototype.$x=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Bn(c,b)};Object.defineProperty(N.prototype,"m_vertices",{get:N.prototype.mw,set:N.prototype.$x});N.prototype.get_m_count=N.prototype.Gu=function(){return Cn(this.Ut)};N.prototype.set_m_count=N.prototype.Vu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Dn(c,b)};
Object.defineProperty(N.prototype,"m_count",{get:N.prototype.Gu,set:N.prototype.Vu});N.prototype.get_m_prevVertex=N.prototype.hw=function(){return h(En(this.Ut),m)};N.prototype.set_m_prevVertex=N.prototype.Vx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Fn(c,b)};Object.defineProperty(N.prototype,"m_prevVertex",{get:N.prototype.hw,set:N.prototype.Vx});N.prototype.get_m_nextVertex=N.prototype.fw=function(){return h(Gn(this.Ut),m)};
N.prototype.set_m_nextVertex=N.prototype.Tx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Hn(c,b)};Object.defineProperty(N.prototype,"m_nextVertex",{get:N.prototype.fw,set:N.prototype.Tx});N.prototype.get_m_hasPrevVertex=N.prototype.cw=function(){return!!In(this.Ut)};N.prototype.set_m_hasPrevVertex=N.prototype.Qx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Jn(c,b)};Object.defineProperty(N.prototype,"m_hasPrevVertex",{get:N.prototype.cw,set:N.prototype.Qx});
N.prototype.get_m_hasNextVertex=N.prototype.bw=function(){return!!Kn(this.Ut)};N.prototype.set_m_hasNextVertex=N.prototype.Px=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ln(c,b)};Object.defineProperty(N.prototype,"m_hasNextVertex",{get:N.prototype.bw,set:N.prototype.Px});N.prototype.get_m_type=N.prototype.lu=function(){return Mn(this.Ut)};N.prototype.set_m_type=N.prototype.nu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Nn(c,b)};
Object.defineProperty(N.prototype,"m_type",{get:N.prototype.lu,set:N.prototype.nu});N.prototype.get_m_radius=N.prototype.ku=function(){return On(this.Ut)};N.prototype.set_m_radius=N.prototype.mu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Pn(c,b)};Object.defineProperty(N.prototype,"m_radius",{get:N.prototype.ku,set:N.prototype.mu});N.prototype.__destroy__=function(){Qn(this.Ut)};
function O(b,c,d){b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);this.Ut=void 0===b?Rn():void 0===c?_emscripten_bind_b2Color_b2Color_1(b):void 0===d?_emscripten_bind_b2Color_b2Color_2(b,c):Sn(b,c,d);g(O)[this.Ut]=this}O.prototype=Object.create(e.prototype);O.prototype.constructor=O;O.prototype.Vt=O;O.Wt={};a.b2Color=O;
O.prototype.Set=O.prototype.Set=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Tn(f,b,c,d)};O.prototype.get_r=O.prototype.Aw=function(){return Un(this.Ut)};O.prototype.set_r=O.prototype.ny=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Vn(c,b)};Object.defineProperty(O.prototype,"r",{get:O.prototype.Aw,set:O.prototype.ny});O.prototype.get_g=O.prototype.Ev=function(){return Wn(this.Ut)};
O.prototype.set_g=O.prototype.rx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xn(c,b)};Object.defineProperty(O.prototype,"g",{get:O.prototype.Ev,set:O.prototype.rx});O.prototype.get_b=O.prototype.nv=function(){return Yn(this.Ut)};O.prototype.set_b=O.prototype.ax=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zn(c,b)};Object.defineProperty(O.prototype,"b",{get:O.prototype.nv,set:O.prototype.ax});O.prototype.__destroy__=function(){$n(this.Ut)};
function Rw(){throw"cannot construct a b2RopeJoint, no constructor in IDL";}Rw.prototype=Object.create(k.prototype);Rw.prototype.constructor=Rw;Rw.prototype.Vt=Rw;Rw.Wt={};a.b2RopeJoint=Rw;Rw.prototype.GetLocalAnchorA=function(){return h(ao(this.Ut),m)};Rw.prototype.GetLocalAnchorB=function(){return h(bo(this.Ut),m)};Rw.prototype.SetMaxLength=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);co(c,b)};Rw.prototype.GetMaxLength=function(){return eo(this.Ut)};Rw.prototype.GetLimitState=function(){return fo(this.Ut)};
Rw.prototype.GetType=function(){return go(this.Ut)};Rw.prototype.GetBodyA=function(){return h(ho(this.Ut),l)};Rw.prototype.GetBodyB=function(){return h(io(this.Ut),l)};Rw.prototype.GetAnchorA=function(){return h(jo(this.Ut),m)};Rw.prototype.GetAnchorB=function(){return h(ko(this.Ut),m)};Rw.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(lo(c,b),m)};Rw.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return mo(c,b)};
Rw.prototype.GetNext=function(){return h(no(this.Ut),k)};Rw.prototype.GetUserData=function(){return oo(this.Ut)};Rw.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);po(c,b)};Rw.prototype.IsActive=function(){return!!qo(this.Ut)};Rw.prototype.GetCollideConnected=function(){return!!ro(this.Ut)};Rw.prototype.__destroy__=function(){so(this.Ut)};function Sw(){throw"cannot construct a b2RayCastInput, no constructor in IDL";}Sw.prototype=Object.create(e.prototype);
Sw.prototype.constructor=Sw;Sw.prototype.Vt=Sw;Sw.Wt={};a.b2RayCastInput=Sw;Sw.prototype.get_p1=Sw.prototype.uw=function(){return h(to(this.Ut),m)};Sw.prototype.set_p1=Sw.prototype.hy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);uo(c,b)};Object.defineProperty(Sw.prototype,"p1",{get:Sw.prototype.uw,set:Sw.prototype.hy});Sw.prototype.get_p2=Sw.prototype.vw=function(){return h(vo(this.Ut),m)};
Sw.prototype.set_p2=Sw.prototype.iy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wo(c,b)};Object.defineProperty(Sw.prototype,"p2",{get:Sw.prototype.vw,set:Sw.prototype.iy});Sw.prototype.get_maxFraction=Sw.prototype.pw=function(){return xo(this.Ut)};Sw.prototype.set_maxFraction=Sw.prototype.cy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);yo(c,b)};Object.defineProperty(Sw.prototype,"maxFraction",{get:Sw.prototype.pw,set:Sw.prototype.cy});Sw.prototype.__destroy__=function(){zo(this.Ut)};
function P(){this.Ut=Ao();g(P)[this.Ut]=this}P.prototype=Object.create(p.prototype);P.prototype.constructor=P;P.prototype.Vt=P;P.Wt={};a.b2PolygonShape=P;P.prototype.Set=P.prototype.Set=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Bo(d,b,c)};
P.prototype.SetAsBox=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);void 0===d?Co(y,b,c):void 0===f?_emscripten_bind_b2PolygonShape_SetAsBox_3(y,b,c,d):Do(y,b,c,d,f)};P.prototype.GetVertexCount=function(){return Eo(this.Ut)};P.prototype.GetVertex=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Fo(c,b),m)};P.prototype.GetType=function(){return Go(this.Ut)};
P.prototype.GetChildCount=function(){return Ho(this.Ut)};P.prototype.TestPoint=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return!!Io(d,b,c)};P.prototype.RayCast=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);return!!Jo(y,b,c,d,f)};
P.prototype.ComputeAABB=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Ko(f,b,c,d)};P.prototype.ComputeMass=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Lo(d,b,c)};P.prototype.get_m_centroid=P.prototype.aw=function(){return h(Mo(this.Ut),m)};P.prototype.set_m_centroid=P.prototype.Ox=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);No(c,b)};
Object.defineProperty(P.prototype,"m_centroid",{get:P.prototype.aw,set:P.prototype.Ox});P.prototype.get_m_count=P.prototype.Gu=function(){return Oo(this.Ut)};P.prototype.set_m_count=P.prototype.Vu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Po(c,b)};Object.defineProperty(P.prototype,"m_count",{get:P.prototype.Gu,set:P.prototype.Vu});P.prototype.get_m_type=P.prototype.lu=function(){return Qo(this.Ut)};
P.prototype.set_m_type=P.prototype.nu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ro(c,b)};Object.defineProperty(P.prototype,"m_type",{get:P.prototype.lu,set:P.prototype.nu});P.prototype.get_m_radius=P.prototype.ku=function(){return So(this.Ut)};P.prototype.set_m_radius=P.prototype.mu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);To(c,b)};Object.defineProperty(P.prototype,"m_radius",{get:P.prototype.ku,set:P.prototype.mu});P.prototype.__destroy__=function(){Uo(this.Ut)};
function Q(){this.Ut=Vo();g(Q)[this.Ut]=this}Q.prototype=Object.create(p.prototype);Q.prototype.constructor=Q;Q.prototype.Vt=Q;Q.Wt={};a.b2EdgeShape=Q;Q.prototype.Set=Q.prototype.Set=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Wo(d,b,c)};Q.prototype.GetType=function(){return Xo(this.Ut)};Q.prototype.GetChildCount=function(){return Yo(this.Ut)};
Q.prototype.TestPoint=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return!!Zo(d,b,c)};Q.prototype.RayCast=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);return!!$o(y,b,c,d,f)};
Q.prototype.ComputeAABB=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);ap(f,b,c,d)};Q.prototype.ComputeMass=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);bp(d,b,c)};Q.prototype.get_m_vertex1=Q.prototype.jw=function(){return h(cp(this.Ut),m)};Q.prototype.set_m_vertex1=Q.prototype.Xx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);dp(c,b)};
Object.defineProperty(Q.prototype,"m_vertex1",{get:Q.prototype.jw,set:Q.prototype.Xx});Q.prototype.get_m_vertex2=Q.prototype.kw=function(){return h(ep(this.Ut),m)};Q.prototype.set_m_vertex2=Q.prototype.Yx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);fp(c,b)};Object.defineProperty(Q.prototype,"m_vertex2",{get:Q.prototype.kw,set:Q.prototype.Yx});Q.prototype.get_m_vertex0=Q.prototype.iw=function(){return h(gp(this.Ut),m)};
Q.prototype.set_m_vertex0=Q.prototype.Wx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);hp(c,b)};Object.defineProperty(Q.prototype,"m_vertex0",{get:Q.prototype.iw,set:Q.prototype.Wx});Q.prototype.get_m_vertex3=Q.prototype.lw=function(){return h(ip(this.Ut),m)};Q.prototype.set_m_vertex3=Q.prototype.Zx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);jp(c,b)};Object.defineProperty(Q.prototype,"m_vertex3",{get:Q.prototype.lw,set:Q.prototype.Zx});
Q.prototype.get_m_hasVertex0=Q.prototype.dw=function(){return!!kp(this.Ut)};Q.prototype.set_m_hasVertex0=Q.prototype.Rx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);lp(c,b)};Object.defineProperty(Q.prototype,"m_hasVertex0",{get:Q.prototype.dw,set:Q.prototype.Rx});Q.prototype.get_m_hasVertex3=Q.prototype.ew=function(){return!!mp(this.Ut)};Q.prototype.set_m_hasVertex3=Q.prototype.Sx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);np(c,b)};
Object.defineProperty(Q.prototype,"m_hasVertex3",{get:Q.prototype.ew,set:Q.prototype.Sx});Q.prototype.get_m_type=Q.prototype.lu=function(){return op(this.Ut)};Q.prototype.set_m_type=Q.prototype.nu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);pp(c,b)};Object.defineProperty(Q.prototype,"m_type",{get:Q.prototype.lu,set:Q.prototype.nu});Q.prototype.get_m_radius=Q.prototype.ku=function(){return qp(this.Ut)};
Q.prototype.set_m_radius=Q.prototype.mu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);rp(c,b)};Object.defineProperty(Q.prototype,"m_radius",{get:Q.prototype.ku,set:Q.prototype.mu});Q.prototype.__destroy__=function(){sp(this.Ut)};function Tw(){this.Ut=tp();g(Tw)[this.Ut]=this}Tw.prototype=Object.create(yw.prototype);Tw.prototype.constructor=Tw;Tw.prototype.Vt=Tw;Tw.Wt={};a.JSContactFilter=Tw;
Tw.prototype.ShouldCollide=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return!!up(d,b,c)};Tw.prototype.__destroy__=function(){vp(this.Ut)};function R(){this.Ut=wp();g(R)[this.Ut]=this}R.prototype=Object.create(n.prototype);R.prototype.constructor=R;R.prototype.Vt=R;R.Wt={};a.b2RevoluteJointDef=R;
R.prototype.Initialize=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);xp(f,b,c,d)};R.prototype.get_localAnchorA=R.prototype.gu=function(){return h(yp(this.Ut),m)};R.prototype.set_localAnchorA=R.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);zp(c,b)};Object.defineProperty(R.prototype,"localAnchorA",{get:R.prototype.gu,set:R.prototype.iu});
R.prototype.get_localAnchorB=R.prototype.hu=function(){return h(Ap(this.Ut),m)};R.prototype.set_localAnchorB=R.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Bp(c,b)};Object.defineProperty(R.prototype,"localAnchorB",{get:R.prototype.hu,set:R.prototype.ju});R.prototype.get_referenceAngle=R.prototype.vu=function(){return Cp(this.Ut)};R.prototype.set_referenceAngle=R.prototype.zu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Dp(c,b)};
Object.defineProperty(R.prototype,"referenceAngle",{get:R.prototype.vu,set:R.prototype.zu});R.prototype.get_enableLimit=R.prototype.Bu=function(){return!!Ep(this.Ut)};R.prototype.set_enableLimit=R.prototype.Qu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Fp(c,b)};Object.defineProperty(R.prototype,"enableLimit",{get:R.prototype.Bu,set:R.prototype.Qu});R.prototype.get_lowerAngle=R.prototype.Yv=function(){return Gp(this.Ut)};
R.prototype.set_lowerAngle=R.prototype.Lx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Hp(c,b)};Object.defineProperty(R.prototype,"lowerAngle",{get:R.prototype.Yv,set:R.prototype.Lx});R.prototype.get_upperAngle=R.prototype.Pw=function(){return Ip(this.Ut)};R.prototype.set_upperAngle=R.prototype.Cy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Jp(c,b)};Object.defineProperty(R.prototype,"upperAngle",{get:R.prototype.Pw,set:R.prototype.Cy});
R.prototype.get_enableMotor=R.prototype.su=function(){return!!Kp(this.Ut)};R.prototype.set_enableMotor=R.prototype.wu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lp(c,b)};Object.defineProperty(R.prototype,"enableMotor",{get:R.prototype.su,set:R.prototype.wu});R.prototype.get_motorSpeed=R.prototype.uu=function(){return Mp(this.Ut)};R.prototype.set_motorSpeed=R.prototype.yu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Np(c,b)};
Object.defineProperty(R.prototype,"motorSpeed",{get:R.prototype.uu,set:R.prototype.yu});R.prototype.get_maxMotorTorque=R.prototype.Hu=function(){return Op(this.Ut)};R.prototype.set_maxMotorTorque=R.prototype.Wu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Pp(c,b)};Object.defineProperty(R.prototype,"maxMotorTorque",{get:R.prototype.Hu,set:R.prototype.Wu});R.prototype.get_type=R.prototype.Xt=function(){return Qp(this.Ut)};
R.prototype.set_type=R.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Rp(c,b)};Object.defineProperty(R.prototype,"type",{get:R.prototype.Xt,set:R.prototype.Zt});R.prototype.get_userData=R.prototype.Yt=function(){return Sp(this.Ut)};R.prototype.set_userData=R.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Tp(c,b)};Object.defineProperty(R.prototype,"userData",{get:R.prototype.Yt,set:R.prototype.$t});
R.prototype.get_bodyA=R.prototype.au=function(){return h(Up(this.Ut),l)};R.prototype.set_bodyA=R.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Vp(c,b)};Object.defineProperty(R.prototype,"bodyA",{get:R.prototype.au,set:R.prototype.du});R.prototype.get_bodyB=R.prototype.bu=function(){return h(Wp(this.Ut),l)};R.prototype.set_bodyB=R.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xp(c,b)};
Object.defineProperty(R.prototype,"bodyB",{get:R.prototype.bu,set:R.prototype.eu});R.prototype.get_collideConnected=R.prototype.cu=function(){return!!Yp(this.Ut)};R.prototype.set_collideConnected=R.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zp(c,b)};Object.defineProperty(R.prototype,"collideConnected",{get:R.prototype.cu,set:R.prototype.fu});R.prototype.__destroy__=function(){$p(this.Ut)};function Uw(){this.Ut=aq();g(Uw)[this.Ut]=this}Uw.prototype=Object.create(uw.prototype);
Uw.prototype.constructor=Uw;Uw.prototype.Vt=Uw;Uw.Wt={};a.JSDraw=Uw;Uw.prototype.DrawPolygon=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);bq(f,b,c,d)};Uw.prototype.DrawSolidPolygon=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);cq(f,b,c,d)};
Uw.prototype.DrawCircle=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);dq(f,b,c,d)};Uw.prototype.DrawSolidCircle=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);eq(y,b,c,d,f)};
Uw.prototype.DrawSegment=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);fq(f,b,c,d)};Uw.prototype.DrawTransform=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);gq(c,b)};Uw.prototype.__destroy__=function(){hq(this.Ut)};function S(){throw"cannot construct a b2WheelJoint, no constructor in IDL";}S.prototype=Object.create(k.prototype);S.prototype.constructor=S;S.prototype.Vt=S;S.Wt={};a.b2WheelJoint=S;
S.prototype.GetLocalAnchorA=function(){return h(iq(this.Ut),m)};S.prototype.GetLocalAnchorB=function(){return h(jq(this.Ut),m)};S.prototype.GetLocalAxisA=function(){return h(kq(this.Ut),m)};S.prototype.GetJointTranslation=function(){return lq(this.Ut)};S.prototype.GetJointSpeed=function(){return mq(this.Ut)};S.prototype.IsMotorEnabled=function(){return!!nq(this.Ut)};S.prototype.EnableMotor=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);oq(c,b)};
S.prototype.SetMotorSpeed=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);pq(c,b)};S.prototype.GetMotorSpeed=function(){return qq(this.Ut)};S.prototype.SetMaxMotorTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);rq(c,b)};S.prototype.GetMaxMotorTorque=function(){return sq(this.Ut)};S.prototype.GetMotorTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return tq(c,b)};
S.prototype.SetSpringFrequencyHz=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);uq(c,b)};S.prototype.GetSpringFrequencyHz=function(){return vq(this.Ut)};S.prototype.SetSpringDampingRatio=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wq(c,b)};S.prototype.GetSpringDampingRatio=function(){return xq(this.Ut)};S.prototype.GetType=function(){return yq(this.Ut)};S.prototype.GetBodyA=function(){return h(zq(this.Ut),l)};S.prototype.GetBodyB=function(){return h(Aq(this.Ut),l)};
S.prototype.GetAnchorA=function(){return h(Bq(this.Ut),m)};S.prototype.GetAnchorB=function(){return h(Cq(this.Ut),m)};S.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Dq(c,b),m)};S.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return Eq(c,b)};S.prototype.GetNext=function(){return h(Fq(this.Ut),k)};S.prototype.GetUserData=function(){return Gq(this.Ut)};
S.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Hq(c,b)};S.prototype.IsActive=function(){return!!Iq(this.Ut)};S.prototype.GetCollideConnected=function(){return!!Jq(this.Ut)};S.prototype.__destroy__=function(){Kq(this.Ut)};function Vw(){throw"cannot construct a b2PulleyJoint, no constructor in IDL";}Vw.prototype=Object.create(k.prototype);Vw.prototype.constructor=Vw;Vw.prototype.Vt=Vw;Vw.Wt={};a.b2PulleyJoint=Vw;
Vw.prototype.GetGroundAnchorA=function(){return h(Lq(this.Ut),m)};Vw.prototype.GetGroundAnchorB=function(){return h(Mq(this.Ut),m)};Vw.prototype.GetLengthA=function(){return Nq(this.Ut)};Vw.prototype.GetLengthB=function(){return Oq(this.Ut)};Vw.prototype.GetRatio=function(){return Pq(this.Ut)};Vw.prototype.GetCurrentLengthA=function(){return Qq(this.Ut)};Vw.prototype.GetCurrentLengthB=function(){return Rq(this.Ut)};Vw.prototype.GetType=function(){return Sq(this.Ut)};
Vw.prototype.GetBodyA=function(){return h(Tq(this.Ut),l)};Vw.prototype.GetBodyB=function(){return h(Uq(this.Ut),l)};Vw.prototype.GetAnchorA=function(){return h(Vq(this.Ut),m)};Vw.prototype.GetAnchorB=function(){return h(Wq(this.Ut),m)};Vw.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Xq(c,b),m)};Vw.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return Yq(c,b)};
Vw.prototype.GetNext=function(){return h(Zq(this.Ut),k)};Vw.prototype.GetUserData=function(){return $q(this.Ut)};Vw.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ar(c,b)};Vw.prototype.IsActive=function(){return!!br(this.Ut)};Vw.prototype.GetCollideConnected=function(){return!!cr(this.Ut)};Vw.prototype.__destroy__=function(){dr(this.Ut)};function T(){this.Ut=er();g(T)[this.Ut]=this}T.prototype=Object.create(n.prototype);T.prototype.constructor=T;T.prototype.Vt=T;
T.Wt={};a.b2MouseJointDef=T;T.prototype.get_target=T.prototype.Mw=function(){return h(fr(this.Ut),m)};T.prototype.set_target=T.prototype.zy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);gr(c,b)};Object.defineProperty(T.prototype,"target",{get:T.prototype.Mw,set:T.prototype.zy});T.prototype.get_maxForce=T.prototype.tu=function(){return hr(this.Ut)};T.prototype.set_maxForce=T.prototype.xu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ir(c,b)};
Object.defineProperty(T.prototype,"maxForce",{get:T.prototype.tu,set:T.prototype.xu});T.prototype.get_frequencyHz=T.prototype.pu=function(){return jr(this.Ut)};T.prototype.set_frequencyHz=T.prototype.ru=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);kr(c,b)};Object.defineProperty(T.prototype,"frequencyHz",{get:T.prototype.pu,set:T.prototype.ru});T.prototype.get_dampingRatio=T.prototype.ou=function(){return lr(this.Ut)};
T.prototype.set_dampingRatio=T.prototype.qu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);mr(c,b)};Object.defineProperty(T.prototype,"dampingRatio",{get:T.prototype.ou,set:T.prototype.qu});T.prototype.get_type=T.prototype.Xt=function(){return nr(this.Ut)};T.prototype.set_type=T.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);or(c,b)};Object.defineProperty(T.prototype,"type",{get:T.prototype.Xt,set:T.prototype.Zt});T.prototype.get_userData=T.prototype.Yt=function(){return pr(this.Ut)};
T.prototype.set_userData=T.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);qr(c,b)};Object.defineProperty(T.prototype,"userData",{get:T.prototype.Yt,set:T.prototype.$t});T.prototype.get_bodyA=T.prototype.au=function(){return h(rr(this.Ut),l)};T.prototype.set_bodyA=T.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);sr(c,b)};Object.defineProperty(T.prototype,"bodyA",{get:T.prototype.au,set:T.prototype.du});
T.prototype.get_bodyB=T.prototype.bu=function(){return h(tr(this.Ut),l)};T.prototype.set_bodyB=T.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ur(c,b)};Object.defineProperty(T.prototype,"bodyB",{get:T.prototype.bu,set:T.prototype.eu});T.prototype.get_collideConnected=T.prototype.cu=function(){return!!vr(this.Ut)};T.prototype.set_collideConnected=T.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wr(c,b)};
Object.defineProperty(T.prototype,"collideConnected",{get:T.prototype.cu,set:T.prototype.fu});T.prototype.__destroy__=function(){xr(this.Ut)};function Iw(){throw"cannot construct a b2Contact, no constructor in IDL";}Iw.prototype=Object.create(e.prototype);Iw.prototype.constructor=Iw;Iw.prototype.Vt=Iw;Iw.Wt={};a.b2Contact=Iw;Iw.prototype.GetManifold=function(){return h(yr(this.Ut),C)};Iw.prototype.GetWorldManifold=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);zr(c,b)};
Iw.prototype.IsTouching=function(){return!!Ar(this.Ut)};Iw.prototype.SetEnabled=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Br(c,b)};Iw.prototype.IsEnabled=function(){return!!Cr(this.Ut)};Iw.prototype.GetNext=function(){return h(Dr(this.Ut),Iw)};Iw.prototype.GetFixtureA=function(){return h(Er(this.Ut),t)};Iw.prototype.GetChildIndexA=function(){return Fr(this.Ut)};Iw.prototype.GetFixtureB=function(){return h(Gr(this.Ut),t)};Iw.prototype.GetChildIndexB=function(){return Hr(this.Ut)};
Iw.prototype.SetFriction=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ir(c,b)};Iw.prototype.GetFriction=function(){return Jr(this.Ut)};Iw.prototype.ResetFriction=function(){Kr(this.Ut)};Iw.prototype.SetRestitution=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Lr(c,b)};Iw.prototype.GetRestitution=function(){return Mr(this.Ut)};Iw.prototype.ResetRestitution=function(){Nr(this.Ut)};
Iw.prototype.SetTangentSpeed=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Or(c,b)};Iw.prototype.GetTangentSpeed=function(){return Pr(this.Ut)};function U(){this.Ut=Qr();g(U)[this.Ut]=this}U.prototype=Object.create(n.prototype);U.prototype.constructor=U;U.prototype.Vt=U;U.Wt={};a.b2DistanceJointDef=U;
U.prototype.Initialize=function(b,c,d,f){var y=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);f&&"object"===typeof f&&(f=f.Ut);Rr(y,b,c,d,f)};U.prototype.get_localAnchorA=U.prototype.gu=function(){return h(Sr(this.Ut),m)};U.prototype.set_localAnchorA=U.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Tr(c,b)};Object.defineProperty(U.prototype,"localAnchorA",{get:U.prototype.gu,set:U.prototype.iu});
U.prototype.get_localAnchorB=U.prototype.hu=function(){return h(Ur(this.Ut),m)};U.prototype.set_localAnchorB=U.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Vr(c,b)};Object.defineProperty(U.prototype,"localAnchorB",{get:U.prototype.hu,set:U.prototype.ju});U.prototype.get_length=U.prototype.Rv=function(){return Wr(this.Ut)};U.prototype.set_length=U.prototype.Ex=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xr(c,b)};
Object.defineProperty(U.prototype,"length",{get:U.prototype.Rv,set:U.prototype.Ex});U.prototype.get_frequencyHz=U.prototype.pu=function(){return Yr(this.Ut)};U.prototype.set_frequencyHz=U.prototype.ru=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zr(c,b)};Object.defineProperty(U.prototype,"frequencyHz",{get:U.prototype.pu,set:U.prototype.ru});U.prototype.get_dampingRatio=U.prototype.ou=function(){return $r(this.Ut)};
U.prototype.set_dampingRatio=U.prototype.qu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);as(c,b)};Object.defineProperty(U.prototype,"dampingRatio",{get:U.prototype.ou,set:U.prototype.qu});U.prototype.get_type=U.prototype.Xt=function(){return bs(this.Ut)};U.prototype.set_type=U.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);cs(c,b)};Object.defineProperty(U.prototype,"type",{get:U.prototype.Xt,set:U.prototype.Zt});U.prototype.get_userData=U.prototype.Yt=function(){return ds(this.Ut)};
U.prototype.set_userData=U.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);es(c,b)};Object.defineProperty(U.prototype,"userData",{get:U.prototype.Yt,set:U.prototype.$t});U.prototype.get_bodyA=U.prototype.au=function(){return h(gs(this.Ut),l)};U.prototype.set_bodyA=U.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);hs(c,b)};Object.defineProperty(U.prototype,"bodyA",{get:U.prototype.au,set:U.prototype.du});
U.prototype.get_bodyB=U.prototype.bu=function(){return h(is(this.Ut),l)};U.prototype.set_bodyB=U.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);js(c,b)};Object.defineProperty(U.prototype,"bodyB",{get:U.prototype.bu,set:U.prototype.eu});U.prototype.get_collideConnected=U.prototype.cu=function(){return!!ks(this.Ut)};U.prototype.set_collideConnected=U.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ls(c,b)};
Object.defineProperty(U.prototype,"collideConnected",{get:U.prototype.cu,set:U.prototype.fu});U.prototype.__destroy__=function(){ms(this.Ut)};function l(){throw"cannot construct a b2Body, no constructor in IDL";}l.prototype=Object.create(e.prototype);l.prototype.constructor=l;l.prototype.Vt=l;l.Wt={};a.b2Body=l;l.prototype.CreateFixture=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);return void 0===c?h(ns(d,b),t):h(ps(d,b,c),t)};
l.prototype.DestroyFixture=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);qs(c,b)};l.prototype.SetTransform=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);rs(d,b,c)};l.prototype.GetTransform=function(){return h(ss(this.Ut),Qw)};l.prototype.GetPosition=function(){return h(ts(this.Ut),m)};l.prototype.GetAngle=function(){return us(this.Ut)};l.prototype.GetWorldCenter=function(){return h(vs(this.Ut),m)};
l.prototype.GetLocalCenter=function(){return h(xs(this.Ut),m)};l.prototype.SetLinearVelocity=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ys(c,b)};l.prototype.GetLinearVelocity=function(){return h(zs(this.Ut),m)};l.prototype.SetAngularVelocity=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);As(c,b)};l.prototype.GetAngularVelocity=function(){return Bs(this.Ut)};
l.prototype.ApplyForce=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Cs(f,b,c,d)};l.prototype.ApplyForceToCenter=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Ds(d,b,c)};l.prototype.ApplyTorque=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Es(d,b,c)};
l.prototype.ApplyLinearImpulse=function(b,c,d){var f=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);d&&"object"===typeof d&&(d=d.Ut);Fs(f,b,c,d)};l.prototype.ApplyAngularImpulse=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);Gs(d,b,c)};l.prototype.GetMass=function(){return Hs(this.Ut)};l.prototype.GetInertia=function(){return Is(this.Ut)};
l.prototype.GetMassData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Js(c,b)};l.prototype.SetMassData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ks(c,b)};l.prototype.ResetMassData=function(){Ls(this.Ut)};l.prototype.GetWorldPoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Ms(c,b),m)};l.prototype.GetWorldVector=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Ns(c,b),m)};
l.prototype.GetLocalPoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Os(c,b),m)};l.prototype.GetLocalVector=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Ps(c,b),m)};l.prototype.GetLinearVelocityFromWorldPoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Qs(c,b),m)};l.prototype.GetLinearVelocityFromLocalPoint=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Rs(c,b),m)};l.prototype.GetLinearDamping=function(){return Ss(this.Ut)};
l.prototype.SetLinearDamping=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ts(c,b)};l.prototype.GetAngularDamping=function(){return Us(this.Ut)};l.prototype.SetAngularDamping=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Vs(c,b)};l.prototype.GetGravityScale=function(){return Ws(this.Ut)};l.prototype.SetGravityScale=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xs(c,b)};l.prototype.SetType=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ys(c,b)};
l.prototype.GetType=function(){return Zs(this.Ut)};l.prototype.SetBullet=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);$s(c,b)};l.prototype.IsBullet=function(){return!!at(this.Ut)};l.prototype.SetSleepingAllowed=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);bt(c,b)};l.prototype.IsSleepingAllowed=function(){return!!ct(this.Ut)};l.prototype.SetAwake=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);dt(c,b)};l.prototype.IsAwake=function(){return!!et(this.Ut)};
l.prototype.SetActive=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ft(c,b)};l.prototype.IsActive=function(){return!!gt(this.Ut)};l.prototype.SetFixedRotation=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ht(c,b)};l.prototype.IsFixedRotation=function(){return!!it(this.Ut)};l.prototype.GetFixtureList=function(){return h(jt(this.Ut),t)};l.prototype.GetJointList=function(){return h(kt(this.Ut),K)};l.prototype.GetContactList=function(){return h(lt(this.Ut),V)};
l.prototype.GetNext=function(){return h(mt(this.Ut),l)};l.prototype.GetUserData=function(){return nt(this.Ut)};l.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ot(c,b)};l.prototype.GetWorld=function(){return h(pt(this.Ut),F)};l.prototype.Dump=function(){qt(this.Ut)};function Ww(){throw"cannot construct a b2FrictionJoint, no constructor in IDL";}Ww.prototype=Object.create(k.prototype);Ww.prototype.constructor=Ww;Ww.prototype.Vt=Ww;Ww.Wt={};a.b2FrictionJoint=Ww;
Ww.prototype.GetLocalAnchorA=function(){return h(rt(this.Ut),m)};Ww.prototype.GetLocalAnchorB=function(){return h(st(this.Ut),m)};Ww.prototype.SetMaxForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);tt(c,b)};Ww.prototype.GetMaxForce=function(){return ut(this.Ut)};Ww.prototype.SetMaxTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);vt(c,b)};Ww.prototype.GetMaxTorque=function(){return wt(this.Ut)};Ww.prototype.GetType=function(){return xt(this.Ut)};
Ww.prototype.GetBodyA=function(){return h(yt(this.Ut),l)};Ww.prototype.GetBodyB=function(){return h(zt(this.Ut),l)};Ww.prototype.GetAnchorA=function(){return h(At(this.Ut),m)};Ww.prototype.GetAnchorB=function(){return h(Bt(this.Ut),m)};Ww.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(Ct(c,b),m)};Ww.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return Dt(c,b)};
Ww.prototype.GetNext=function(){return h(Et(this.Ut),k)};Ww.prototype.GetUserData=function(){return Ft(this.Ut)};Ww.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Gt(c,b)};Ww.prototype.IsActive=function(){return!!Ht(this.Ut)};Ww.prototype.GetCollideConnected=function(){return!!It(this.Ut)};Ww.prototype.__destroy__=function(){Jt(this.Ut)};function Xw(){throw"cannot construct a b2DestructionListener, no constructor in IDL";}Xw.prototype=Object.create(e.prototype);
Xw.prototype.constructor=Xw;Xw.prototype.Vt=Xw;Xw.Wt={};a.b2DestructionListener=Xw;Xw.prototype.__destroy__=function(){Kt(this.Ut)};function W(){this.Ut=Lt();g(W)[this.Ut]=this}W.prototype=Object.create(n.prototype);W.prototype.constructor=W;W.prototype.Vt=W;W.Wt={};a.b2GearJointDef=W;W.prototype.get_joint1=W.prototype.Ov=function(){return h(Mt(this.Ut),k)};W.prototype.set_joint1=W.prototype.Bx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Nt(c,b)};
Object.defineProperty(W.prototype,"joint1",{get:W.prototype.Ov,set:W.prototype.Bx});W.prototype.get_joint2=W.prototype.Pv=function(){return h(Ot(this.Ut),k)};W.prototype.set_joint2=W.prototype.Cx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Pt(c,b)};Object.defineProperty(W.prototype,"joint2",{get:W.prototype.Pv,set:W.prototype.Cx});W.prototype.get_ratio=W.prototype.Nu=function(){return Qt(this.Ut)};
W.prototype.set_ratio=W.prototype.bv=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Rt(c,b)};Object.defineProperty(W.prototype,"ratio",{get:W.prototype.Nu,set:W.prototype.bv});W.prototype.get_type=W.prototype.Xt=function(){return St(this.Ut)};W.prototype.set_type=W.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Tt(c,b)};Object.defineProperty(W.prototype,"type",{get:W.prototype.Xt,set:W.prototype.Zt});W.prototype.get_userData=W.prototype.Yt=function(){return Ut(this.Ut)};
W.prototype.set_userData=W.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Vt(c,b)};Object.defineProperty(W.prototype,"userData",{get:W.prototype.Yt,set:W.prototype.$t});W.prototype.get_bodyA=W.prototype.au=function(){return h(Wt(this.Ut),l)};W.prototype.set_bodyA=W.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Xt(c,b)};Object.defineProperty(W.prototype,"bodyA",{get:W.prototype.au,set:W.prototype.du});
W.prototype.get_bodyB=W.prototype.bu=function(){return h(Yt(this.Ut),l)};W.prototype.set_bodyB=W.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Zt(c,b)};Object.defineProperty(W.prototype,"bodyB",{get:W.prototype.bu,set:W.prototype.eu});W.prototype.get_collideConnected=W.prototype.cu=function(){return!!$t(this.Ut)};W.prototype.set_collideConnected=W.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);au(c,b)};
Object.defineProperty(W.prototype,"collideConnected",{get:W.prototype.cu,set:W.prototype.fu});W.prototype.__destroy__=function(){bu(this.Ut)};function X(){throw"cannot construct a b2RevoluteJoint, no constructor in IDL";}X.prototype=Object.create(k.prototype);X.prototype.constructor=X;X.prototype.Vt=X;X.Wt={};a.b2RevoluteJoint=X;X.prototype.GetLocalAnchorA=function(){return h(cu(this.Ut),m)};X.prototype.GetLocalAnchorB=function(){return h(du(this.Ut),m)};X.prototype.GetReferenceAngle=function(){return eu(this.Ut)};
X.prototype.GetJointAngle=function(){return fu(this.Ut)};X.prototype.GetJointSpeed=function(){return gu(this.Ut)};X.prototype.IsLimitEnabled=function(){return!!hu(this.Ut)};X.prototype.EnableLimit=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);iu(c,b)};X.prototype.GetLowerLimit=function(){return ju(this.Ut)};X.prototype.GetUpperLimit=function(){return ku(this.Ut)};
X.prototype.SetLimits=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);lu(d,b,c)};X.prototype.IsMotorEnabled=function(){return!!mu(this.Ut)};X.prototype.EnableMotor=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);nu(c,b)};X.prototype.SetMotorSpeed=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ou(c,b)};X.prototype.GetMotorSpeed=function(){return pu(this.Ut)};
X.prototype.SetMaxMotorTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);qu(c,b)};X.prototype.GetMaxMotorTorque=function(){return ru(this.Ut)};X.prototype.GetMotorTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return su(c,b)};X.prototype.GetType=function(){return tu(this.Ut)};X.prototype.GetBodyA=function(){return h(uu(this.Ut),l)};X.prototype.GetBodyB=function(){return h(vu(this.Ut),l)};X.prototype.GetAnchorA=function(){return h(wu(this.Ut),m)};
X.prototype.GetAnchorB=function(){return h(xu(this.Ut),m)};X.prototype.GetReactionForce=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return h(yu(c,b),m)};X.prototype.GetReactionTorque=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);return zu(c,b)};X.prototype.GetNext=function(){return h(Au(this.Ut),k)};X.prototype.GetUserData=function(){return Bu(this.Ut)};X.prototype.SetUserData=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Cu(c,b)};X.prototype.IsActive=function(){return!!Du(this.Ut)};
X.prototype.GetCollideConnected=function(){return!!Eu(this.Ut)};X.prototype.__destroy__=function(){Fu(this.Ut)};function V(){this.Ut=Gu();g(V)[this.Ut]=this}V.prototype=Object.create(e.prototype);V.prototype.constructor=V;V.prototype.Vt=V;V.Wt={};a.b2ContactEdge=V;V.prototype.get_other=V.prototype.Lu=function(){return h(Hu(this.Ut),l)};V.prototype.set_other=V.prototype.$u=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Iu(c,b)};
Object.defineProperty(V.prototype,"other",{get:V.prototype.Lu,set:V.prototype.$u});V.prototype.get_contact=V.prototype.vv=function(){return h(Ju(this.Ut),Iw)};V.prototype.set_contact=V.prototype.ix=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ku(c,b)};Object.defineProperty(V.prototype,"contact",{get:V.prototype.vv,set:V.prototype.ix});V.prototype.get_prev=V.prototype.Mu=function(){return h(Lu(this.Ut),V)};
V.prototype.set_prev=V.prototype.av=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Mu(c,b)};Object.defineProperty(V.prototype,"prev",{get:V.prototype.Mu,set:V.prototype.av});V.prototype.get_next=V.prototype.Ju=function(){return h(Nu(this.Ut),V)};V.prototype.set_next=V.prototype.Yu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Ou(c,b)};Object.defineProperty(V.prototype,"next",{get:V.prototype.Ju,set:V.prototype.Yu});V.prototype.__destroy__=function(){Pu(this.Ut)};
function Y(){this.Ut=Qu();g(Y)[this.Ut]=this}Y.prototype=Object.create(n.prototype);Y.prototype.constructor=Y;Y.prototype.Vt=Y;Y.Wt={};a.b2RopeJointDef=Y;Y.prototype.get_localAnchorA=Y.prototype.gu=function(){return h(Ru(this.Ut),m)};Y.prototype.set_localAnchorA=Y.prototype.iu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Su(c,b)};Object.defineProperty(Y.prototype,"localAnchorA",{get:Y.prototype.gu,set:Y.prototype.iu});
Y.prototype.get_localAnchorB=Y.prototype.hu=function(){return h(Tu(this.Ut),m)};Y.prototype.set_localAnchorB=Y.prototype.ju=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Uu(c,b)};Object.defineProperty(Y.prototype,"localAnchorB",{get:Y.prototype.hu,set:Y.prototype.ju});Y.prototype.get_maxLength=Y.prototype.qw=function(){return Vu(this.Ut)};Y.prototype.set_maxLength=Y.prototype.dy=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Wu(c,b)};
Object.defineProperty(Y.prototype,"maxLength",{get:Y.prototype.qw,set:Y.prototype.dy});Y.prototype.get_type=Y.prototype.Xt=function(){return Xu(this.Ut)};Y.prototype.set_type=Y.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Yu(c,b)};Object.defineProperty(Y.prototype,"type",{get:Y.prototype.Xt,set:Y.prototype.Zt});Y.prototype.get_userData=Y.prototype.Yt=function(){return Zu(this.Ut)};
Y.prototype.set_userData=Y.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);$u(c,b)};Object.defineProperty(Y.prototype,"userData",{get:Y.prototype.Yt,set:Y.prototype.$t});Y.prototype.get_bodyA=Y.prototype.au=function(){return h(av(this.Ut),l)};Y.prototype.set_bodyA=Y.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);bv(c,b)};Object.defineProperty(Y.prototype,"bodyA",{get:Y.prototype.au,set:Y.prototype.du});
Y.prototype.get_bodyB=Y.prototype.bu=function(){return h(cv(this.Ut),l)};Y.prototype.set_bodyB=Y.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);dv(c,b)};Object.defineProperty(Y.prototype,"bodyB",{get:Y.prototype.bu,set:Y.prototype.eu});Y.prototype.get_collideConnected=Y.prototype.cu=function(){return!!ev(this.Ut)};Y.prototype.set_collideConnected=Y.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);fv(c,b)};
Object.defineProperty(Y.prototype,"collideConnected",{get:Y.prototype.cu,set:Y.prototype.fu});Y.prototype.__destroy__=function(){gv(this.Ut)};function Z(){this.Ut=hv();g(Z)[this.Ut]=this}Z.prototype=Object.create(n.prototype);Z.prototype.constructor=Z;Z.prototype.Vt=Z;Z.Wt={};a.b2MotorJointDef=Z;Z.prototype.Initialize=function(b,c){var d=this.Ut;b&&"object"===typeof b&&(b=b.Ut);c&&"object"===typeof c&&(c=c.Ut);iv(d,b,c)};
Z.prototype.get_linearOffset=Z.prototype.Vv=function(){return h(jv(this.Ut),m)};Z.prototype.set_linearOffset=Z.prototype.Ix=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);kv(c,b)};Object.defineProperty(Z.prototype,"linearOffset",{get:Z.prototype.Vv,set:Z.prototype.Ix});Z.prototype.get_angularOffset=Z.prototype.kv=function(){return lv(this.Ut)};Z.prototype.set_angularOffset=Z.prototype.Yw=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);mv(c,b)};
Object.defineProperty(Z.prototype,"angularOffset",{get:Z.prototype.kv,set:Z.prototype.Yw});Z.prototype.get_maxForce=Z.prototype.tu=function(){return nv(this.Ut)};Z.prototype.set_maxForce=Z.prototype.xu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);ov(c,b)};Object.defineProperty(Z.prototype,"maxForce",{get:Z.prototype.tu,set:Z.prototype.xu});Z.prototype.get_maxTorque=Z.prototype.Iu=function(){return pv(this.Ut)};
Z.prototype.set_maxTorque=Z.prototype.Xu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);qv(c,b)};Object.defineProperty(Z.prototype,"maxTorque",{get:Z.prototype.Iu,set:Z.prototype.Xu});Z.prototype.get_correctionFactor=Z.prototype.wv=function(){return rv(this.Ut)};Z.prototype.set_correctionFactor=Z.prototype.jx=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);sv(c,b)};Object.defineProperty(Z.prototype,"correctionFactor",{get:Z.prototype.wv,set:Z.prototype.jx});
Z.prototype.get_type=Z.prototype.Xt=function(){return tv(this.Ut)};Z.prototype.set_type=Z.prototype.Zt=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);uv(c,b)};Object.defineProperty(Z.prototype,"type",{get:Z.prototype.Xt,set:Z.prototype.Zt});Z.prototype.get_userData=Z.prototype.Yt=function(){return vv(this.Ut)};Z.prototype.set_userData=Z.prototype.$t=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);wv(c,b)};Object.defineProperty(Z.prototype,"userData",{get:Z.prototype.Yt,set:Z.prototype.$t});
Z.prototype.get_bodyA=Z.prototype.au=function(){return h(xv(this.Ut),l)};Z.prototype.set_bodyA=Z.prototype.du=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);yv(c,b)};Object.defineProperty(Z.prototype,"bodyA",{get:Z.prototype.au,set:Z.prototype.du});Z.prototype.get_bodyB=Z.prototype.bu=function(){return h(zv(this.Ut),l)};Z.prototype.set_bodyB=Z.prototype.eu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Av(c,b)};
Object.defineProperty(Z.prototype,"bodyB",{get:Z.prototype.bu,set:Z.prototype.eu});Z.prototype.get_collideConnected=Z.prototype.cu=function(){return!!Bv(this.Ut)};Z.prototype.set_collideConnected=Z.prototype.fu=function(b){var c=this.Ut;b&&"object"===typeof b&&(b=b.Ut);Cv(c,b)};Object.defineProperty(Z.prototype,"collideConnected",{get:Z.prototype.cu,set:Z.prototype.fu});Z.prototype.__destroy__=function(){Dv(this.Ut)};
(function(){function b(){a.b2Shape.e_circle=Ev();a.b2Shape.e_edge=Fv();a.b2Shape.e_polygon=Gv();a.b2Shape.e_chain=Hv();a.b2Shape.e_typeCount=Iv();a.e_unknownJoint=Jv();a.e_revoluteJoint=Kv();a.e_prismaticJoint=Lv();a.e_distanceJoint=Mv();a.e_pulleyJoint=Nv();a.e_mouseJoint=Ov();a.e_gearJoint=Pv();a.e_wheelJoint=Qv();a.e_weldJoint=Rv();a.e_frictionJoint=Sv();a.e_ropeJoint=Tv();a.e_motorJoint=Uv();a.e_inactiveLimit=Vv();a.e_atLowerLimit=Wv();a.e_atUpperLimit=Xv();a.e_equalLimits=Yv();a.b2Manifold.e_circles=
Zv();a.b2Manifold.e_faceA=$v();a.b2Manifold.e_faceB=aw();a.b2_staticBody=bw();a.b2_kinematicBody=cw();a.b2_dynamicBody=dw();a.b2Draw.e_shapeBit=ew();a.b2Draw.e_jointBit=fw();a.b2Draw.e_aabbBit=gw();a.b2Draw.e_pairBit=hw();a.b2Draw.e_centerOfMassBit=iw();a.b2ContactFeature.e_vertex=jw();a.b2ContactFeature.e_face=kw()}Ka?b():Ia.unshift(b)})();
return Box2D.ready
}
);
})();
gdjs.registerAsynchronouslyLoadingLibraryPromise(initializeBox2D({locateFile: function(path, prefix) {
return location.protocol === 'file:' ?
// This is needed to run on Electron.
prefix + "Extensions/Physics2Behavior/" + path :
prefix + path;
}}).then(box2d => {
window.Box2D = box2d;
}));
})();

Binary file not shown.

View File

@@ -419,8 +419,8 @@ module.exports = {
sharedData
)
.setIncludeFile('Extensions/Physics2Behavior/physics2runtimebehavior.js')
.addIncludeFile('Extensions/Physics2Behavior/box2d.js')
.addIncludeFile('Extensions/Physics2Behavior/utils.js');
.addIncludeFile('Extensions/Physics2Behavior/Box2D_v2.3.1_min.wasm.js')
.addRequiredFile('Extensions/Physics2Behavior/Box2D_v2.3.1_min.wasm.wasm')
// Global
aut

Some files were not shown because too many files have changed in this diff Show More