Giter Site home page Giter Site logo

tsm's Introduction

tsm: A Typescript vector and matrix math library

tsm is a a collection of vector, matrix and quaternion classes written in Typescript.

The library's design is influenced by both gl-matrix and glm.

What's special about tsm?

  • tsm makes use of Javascript's new property definitions to enable GLSL-style swizzle operators:

      let v1 = new vec2();
      let q1 = new quat();
    
      v1.xy = [0, 1];
      q1.w = 1.0;
    
  • tsm offers both non-static and static methods for many operations:

      let v1 = new vec3([1, 2, 3]);
      let v2 = new vec3([4, 5, 6]);
    
      let v3 = vec3.sum(v1, v2);
      let v4 = v1.copy().add(v2);
    
      console.log(v3.equals(v4)); // output: "true"
    

General design notes

Swizzle operators return numeric arrays, not vector instances:

let v = new vec4([1, 2, 3, 4]);
let n = v.xyz; // n = [1, 2, 3]

If, instead, you want to create a new instance of a vector or a matrix, use the copy() method:

let v1 = new vec4([1, 2, 3, 4]);
let v2 = v1.copy();

You can also initialize a new vector with the values of another:

let v1 = new vec4([1, 2, 3, 4]);
let v2 = new vec4(v1.xyzw);

Or copy the values of one vector to another using the swizzle operators or the copy() method:

v2.xyzw = v1.xyzw; // same as v1.copy(v2)

The four basic arithmetic operations can be performed on vector instances or using static methods:

let v1 = new vec4([1, 2, 3, 4]);
let v2 = new vec4([5, 6, 7, 8]);

let v3 = vec4.product(v1, v2); // returns a new vec4 instance

v1.multiply(v2); // writes the result of the multiplication into v1
v2.multiply(v1); // writes the result of the multiplication into v2

The reason for all of these different ways of doing the same thing is that object allocation in Javascript is slow and dynamic allocation should therefore be reduced to a minimum.

For this reason, static methods offer an optional destination parameter:

let v3 = vec3.cross(v1, v2) // allocates a new instance of vec3

is the same as:

let v3 = new vec3();
vec3.cross(v1, v2, v3) // writes into the existing instance

Matrices do not have swizzle operators. Instead, they provide the all(), row() and col() methods:

let m = new mat2([1, 2, 3, 4]);

let all = m.all();  // [1, 2, 3, 4]  
let row = m.row(0); // [1, 2]
let col = m.col(0); // [1, 3] 

tsm's People

Contributors

benjajaja avatar matthiasferch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

tsm's Issues

Quat import error

In ts-matrix.d.ts there in an import error:

import Matrix from './Matrix';
import Quat from './Quat';
import Vector from './Vector';
export { Vector, Matrix, Quat, };

File ./Quat does not exist.
Exist ./quat

This creates a compilation error.
Can you fix it?

Thank you

Automatic resolving of typings via node_modules

Hi

Could you add something along these lines to package.json so the library works automatically in typescript projects when added with npm:

"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",

Br,
Tommi

Typescript 0.9.1.1

great to see an algebra library for typescript.

Unfortunately it does not support the newest version of typescript (0.9.1.1).

Any plan to update the project and source files?

Is it good practice?

modelviewMatrix = TSM.mat4.identity;
modelviewMatrix =TSM.mat4.lookAt(new TSM.vec3([0, 0, 2]),
new TSM.vec3([0, 0, 0]), new TSM.vec3([0, 1, 0]));

modelviewMatrix.translate(new TSM.vec3([X, Y, 0])); 

or better have var outside of function scope, for example:

var vec3OutsideOfScope = new TSM.vec3([0, 0, 0]);

function translate(X,Y) {
vec3OutsideOfScope.xyz = [X,Y,0];
modelviewMatrix.translate(vec3OutsideOfScope); 
}

const TSM.mat4.identity

I just got caught out by a weird non-const issue which took a long time to track down.

I was using mat4.identity to initialise a few values in my application. Later on I called matrix_instance.translate/rotate/scale. This, as I'm sure you can guess, caused all matrices which had been initialised using mat4.identity to change. I definitely wasn't expecting this behaviour.

Is it possible to make mat*.identity a constant value? Or change it to a function which returns an identity matrix.

It's probably worth noting that I'm not that familiar with JS, and I'm very new to typescript. Perhaps a more experienced JS developed would know to expect this. Even so, the possibilty for mat4.identity to not be an identity matrix is a bit sneaky.

This may also apply to other identity values.

Circular Dependencies

I notice there are several circular dependencies in the project, e.g. Mat3 -> Mat4 -> Mat3. Is this a concern for you, or just a side-effect of creating interdependent classes? These might be resolvable, but I don't know if the current design was chosen to maintain efficiency etc and might impact the OO design.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.