Usage of Ammo.js with TypeScript (Ammo.js is a port of Bullet Physics Engine)

Published January 29, 2021
Advertisement

My example shows how to use Ammo.js with TypeScript in Debug and Release modes: hello-ammojs-webgl10-ts

You should install these modules globally:

  • npm i typescript -g
  • npm i browserify -g
  • npm i uglify-js -g

Install all packages from `package.json` using the command: `npm i`

Comment/Uncomment Debug/Release in `index.html` and `main.ts` (see comments in these files).

Use these commands to build the example:

  • `npm run debug` - to set breakpoint in code editors and to publish on PlayGround (like Plunker), for example: Hello Ammo.js. WebGL 1.0, TypeScript
  • `npm run release` - to bundle in `bundle.min.js` for production

Note. See also: Usage of Planck.js with TypeScript (Planck.js is a port of Box2D Physics Engine)

package.json

{
 "name": "hello-ammojs-webgl10-ts",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
   "test": "echo \"Error: no test specified\" && exit 1",
   "debug": "tsc -p tsconfigs/tsconfig.debug.json",
   "compile": "tsc -p tsconfigs/tsconfig.release.json",
   "bundle": "browserify public/js/main.js -o public/js/bundle.js",
   "minify": "uglifyjs public/js/bundle.js -o public/js/bundle.min.js",
   "release": "npm run compile && npm run bundle && npm run minify"
 },
 "keywords": [],
 "author": "",
 "license": "ISC",
 "dependencies": {
   "ammo.js": "github:kripken/ammo.js",
   "requirejs": "^2.3.6"
 },
 "devDependencies": {
   "@types/requirejs": "^2.1.32",
   "ammojs-typed": "^1.0.6"
 }
}

public/index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hello Ammo. WebGL 1.0, TypeScript</title>

    <!-- Debug -->
    <script data-main="js/RequireConfig"
        src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
    <!-- Release -->
    <!-- <script src="js/bundle.min.js"></script> -->
</head>

<body>
    <canvas id="renderCanvas" width="300" height="150"></canvas>

    <div id="output"></div>

    <a href="https://github.com/8Observer8/hello-ammojs-webgl10-ts">Source Code on GitHub</a>
    <br>
    <a href="https://plnkr.co/edit/6KQT9VQHWvswY3cc?preview">Playground</a>
</body>

</html>

src/client/main.ts

import { mat4 } from "gl-matrix";
import AmmoModule from "ammojs-typed";

let Ammo: typeof AmmoModule;
let gl: WebGLRenderingContext;
let output: HTMLDivElement;

function init()
{
   const canvas = document.getElementById("renderCanvas") as HTMLCanvasElement;
   gl = canvas.getContext("webgl");
   gl.clearColor(0.2, 0.2, 0.2, 1);
   gl.clear(gl.COLOR_BUFFER_BIT);

   output = document.getElementById("output") as HTMLDivElement;

   const vec = new Ammo.btVector3(1, 2, 3);
   output.innerHTML = `vec = (${vec.x()}, ${vec.y()}, ${vec.z()})<br>`;

   const matrix = mat4.create();
   output.innerHTML += `matrix = [${matrix}]`;
}

function main()
{
   AmmoModule().then((api) =>
   {
       Ammo = api;
       init();
   });
}

// Debug
main();

// Release
// window.onload = () => main();

src/client/RequireConfig.ts

requirejs.config({
   baseUrl: "js",
   paths: {
       "gl-matrix": "https://cdn.jsdelivr.net/npm/gl-matrix@3.3.0/gl-matrix-min",
       "ammojs-typed": "https://dl.dropboxusercontent.com/s/e5iytx67noqoew7/ammo"
   }
});

requirejs(["main"], () => { });

tsconfigs/tsconfig.json

{
   "compilerOptions": {
       "target": "ES5",
       "outDir": "../public/js",
       "allowSyntheticDefaultImports": true,
       "esModuleInterop": true
   },
   "include": [
       "../src/client/**/*.ts"
   ]
}

tsconfigs/tsconfig.debug.json

{
   "extends": "./tsconfig.json",
   "compilerOptions": {
       "module": "AMD",
       "sourceMap": true,
       "types": [
           "requirejs",
           "gl-matrix",
           "ammojs-typed"
       ],
       "moduleResolution": "node"
   }
}

tsconfigs/tsconfig.release.json

{
   "extends": "./tsconfig.json",
   "compilerOptions": {
       "module": "CommonJS",
       "sourceMap": false,
       "types": [
           "node"
       ]
   },
   "exclude": [
       "../src/client/RequireConfig.ts"
   ]
}
0 likes 0 comments

Comments

Nobody has left a comment. You can be the first!
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Advertisement