the-simian/phaser-glsl-loader

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Phaser 2 GLSL Loader

[![Build Status](https://travis-ci.org/the-simian/phaser-glsl-loader.svg)](https://travis-ci.org/the-simian/phaser-glsl-loader)

[![Coverage Status](https://coveralls.io/repos/the-simian/phaser-glsl-loader/badge.svg?branch=master)](https://coveralls.io/r/the-simian/phaser-glsl-loader?branch=master)

[![Code Climate](https://codeclimate.com/github/the-simian/phaser-glsl-loader/badges/gpa.svg)](https://codeclimate.com/github/the-simian/phaser-glsl-loader)


[![David-Dm](https://david-dm.org/the-simian/phaser-glsl-loader.svg)](https://david-dm.org/the-simian/phaser-glsl-loader)


This is a simple GLSL loader that is meant to work with Phaser 2 and Webpack 1.x.x.

## IMPORTANT: IF YOU ARE USING PHASER 3, this isn't for you.
Check out my other project [create-phaser-app](https://github.com/simiancraft/create-phaser-app) for up-to-date phaser 3 tooling

## The Problem:

Lets say you're working in phaser, and you see a really cool looking fragment shader you want to use.

![Some cool shader](http://i.imgur.com/1xys0Iy.png)


So you go to the phaser examples, and they show you to integrate your code just like this:

```js
var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { create: create, update: update });

var filter;
var sprite;

function create() {

    //  From http://glslsandbox.com/e#20450.0

    var fragmentSrc = [
        "precision mediump float;",
        "uniform vec2      resolution;",
        "uniform float     time;",

        "float size = 0.002;",

        "void main( void ) {",
            "vec2 view = ( gl_FragCoord.xy - resolution / 2.0 ) / ( resolution.y / 2.0);",
            "float time = time + length(view)*8.;",
            "vec4 color = vec4(0);",
            "vec2 center = vec2(0);",
            "float rotationVelocity = 2.0;",
            "for( int j = 0; j < 20; j++ ) {",
                "for( int i = 0; i < 20; i++ ) {",
                    "float amplitude = ( cos( time / 10.0 ) + sin(  time /5.0 ) ) / 2.0;",
                    "float angle =   sin( float(j) * time) * rotationVelocity + 2.0 * 3.14 * float(i) / 20.0;",
                    "center.x = cos( 7.0 * float(j) / 20.0 * 2.0 * 3.14 ) + sin( time / 4.0);",
                    "center.y = sin( 3.0 * float(j) / 20.0 * 2.0 *  3.14 )+ cos( time / 8.0);",
                    "vec2 light = center + amplitude * vec2( cos( angle ), sin( angle ));",
                    "//size = sin( time ) * 0.005;",
                    "float l = size / length( view - light );",
                    "vec4 c = vec4( l / 20.0, l, l, 1.0 ) / 5.0;",
                    "color += c;",
                "}",
            "}",
            "gl_FragColor = color;",
        "}"
    ];

    filter = new Phaser.Filter(game, null, fragmentSrc);
    filter.setResolution(800, 600);

    sprite = game.add.sprite();
    sprite.width = 800;
    sprite.height = 600;

    sprite.filters = [ filter ];

}

function update() {
    filter.update();
}
```

Man, what mess! Wouldnt it be awesome if you could just put the shader into a seperate file and load it that way?

```js
var fragmentSrc = require('../shaders/cubething.frag'),
```

You could cut all that code out into a simple require statement! That is what this loader is for.

## The Solution

First, you need to add the loader to your list of loaders, most likely in your `webpack.config.js` file.

Something like this:

```js
var path = require('path');
var glFragmentLoader = path.join(__dirname, '/node_modules/phaser-glsl-loader');

module.exports = {
  module: {
    loaders: [
      {
        test: /\.frag$/i,
        loader: 'gl-fragment-loader'
      }
    ]
  },
  resolveLoader: {
    alias: {
      'gl-fragment-loader': glFragmentLoader,
    }
  }
};
```
Then you'll be able to reference external files, instead of basically including a large array of strings!