pre-refactor
[NgWiz.git] / game / src / DstEng.js
index ad05e81..0e0e764 100644 (file)
@@ -50,9 +50,20 @@ DstEng.prototype.log = function() {
 
 DstEng.prototype.initGl = function() {
     try {
-        this.gl = this.cfg.screen.getContext("experimental-webgl");
+        this.gl = this.cfg.screen.getContext("webgl");
+        if(! this.gl ) { 
+            this.gl = this.cfg.screen.getContext("experimental-webgl");
+        }
         this.gl.viewportWidth = this.cfg.screen.width;
         this.gl.viewportHeight = this.cfg.screen.height;
+  
+  
+  //http://mrdoob.github.io/webgl-blendfunctions/blendfunc.html      
+/*        var gl = this.gl;
+gl.enable( gl.BLEND );
+gl.blendEquation( gl.FUNC_ADD );
+gl.blendFunc( gl.SRC_ALPHA, gl.DST_ALPHA ); */
     } catch (e) {}
 
     return !!this.gl;
@@ -69,7 +80,7 @@ DstEng.prototype.setupTextureFiltering = function(width, height) {
         // the dimensions are power of 2 so generate mips and turn on 
         // tri-linear filtering.
         this.gl.generateMipmap(this.gl.TEXTURE_2D);
-        //             this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);
+        this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);
         this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST_MIPMAP_NEAREST);
     } else {
         // at least one of the dimensions is not a power of 2 so set the filtering
@@ -78,6 +89,8 @@ DstEng.prototype.setupTextureFiltering = function(width, height) {
         this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
         this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
         this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);
+
+
     }
 };
 
@@ -241,11 +254,9 @@ DstEng.prototype.sndLoader = function(obj, cb) {
             var snd = {
                 valid: true,
                 resType: 'snd',
-                sound: this.audio.add(buffer)
+                play: this.audio.play.bind(this.audio, buffer)
             };
 
-
-
             console.log(snd);
             cb(snd);
 
@@ -257,24 +268,131 @@ DstEng.prototype.sndLoader = function(obj, cb) {
 
 };
 
+DstEng.prototype.jsonLoader = function(obj, cb) {
+    $.ajax({
+        url: obj.url,
+        dataType: 'text',
+        success: function(data) {
+
+            var ret = false;
+
+            try {
+                ret = JSON.parse(data);
+            } catch (e) {
+                ret = false;
+            }
+            cb({
+                valid: !!(ret),
+                value: ret
+            });
+        }.bind(this),
+        error: function(e) {
+            cb({
+                valid: false,
+                error: e.status + ' ' + e.statusText
+            });
+        }
+    });
+};
+
+DstEng.prototype.parseIni = function(txt) {
+
+    var ret = {};
+
+    var lines = txt.split('\n');
+
+    var trimmed = [];
+
+    var curSegment = '_root';
+
+    lines.forEach(function(l) {
+        //Strip comments
+        var idx = l.indexOf('#');
+        if (idx !== -1) {
+            l = l.substring(0, idx);
+        }
+
+        //Trim trailing whitespace
+        l = l.trim();
+
+        if (l.length > 0) {
+            trimmed.push(l);
+        }
+    });
+
+
+    trimmed.forEach(function(l) {
+        //Is this line an assignment?
+        var eqIdx = l.indexOf('=');
+        if (eqIdx !== -1) {
+            var spl = l.split('=');
+            var keyName = spl[0];
+            var val = spl.slice(1).join('=');
+
+            if (!ret[curSegment]) {
+                ret[curSegment] = {};
+            }
+
+            if (!ret[curSegment][keyName]) {
+                ret[curSegment][keyName] = val;
+            } else {
+                if (!Array.isArray(ret[curSegment][keyName])) {
+                    ret[curSegment][keyName] = [ret[curSegment][keyName]];
+                }
+                ret[curSegment][keyName].push(val);
+            }
+        } else if (l.charAt(0) === '[' && l.charAt(l.length - 1) === ']') {
+            curSegment = l.substring(1, l.length - 1);
+        } else {
+            if (!ret[curSegment]) {
+                ret[curSegment] = {
+                    _block: []
+                };
+            }
+
+            ret[curSegment]._block.push(l);
+        }
+    });
+
+    return (ret);
+};
+
+DstEng.prototype.iniLoader = function(obj, cb) {
+    $.ajax({
+        url: obj.url,
+        dataType: 'text',
+        success: function(data) {
+
+            var ret = this.parseIni(data);
+
+            cb({
+                valid: !!(ret),
+                value: ret
+            });
+        }.bind(this),
+        error: function(e) {
+            cb({
+                valid: false,
+                error: e.status + ' ' + e.statusText
+            });
+        }
+    });
+};
+
 DstEng.prototype.audio = (function() {
     function Aud() {
-        this.sounds = [];
+
         window.AudioContext = window.AudioContext || window.webkitAudioContext;
         this.ctx = new AudioContext();
     }
 
-    Aud.prototype.play = function(idx) {
+    Aud.prototype.play = function(buffer) {
         var source = this.ctx.createBufferSource();
-        source.buffer = this.sounds[idx];
+        source.buffer = buffer;
         source.connect(this.ctx.destination);
         source.start(0);
     };
 
-    Aud.prototype.add = function(buffer) {
-        return this.sounds.push(buffer) - 1;
-    };
-
     return new Aud();
 }());
 
@@ -294,6 +412,14 @@ DstEng.prototype.preLoad = function() {
             url: '/data/packs/000_wizznic/themes/oldskool/snd/click.ogg',
             loader: this.sndLoader.bind(this)
         }, {
+            name: 'structure_test',
+            url: '/data/test.json',
+            loader: this.jsonLoader.bind(this)
+        }, {
+            name: 'ini_test',
+            url: '/data/packs/000_wizznic/info.ini',
+            loader: this.iniLoader.bind(this)
+        }, {
             name: 'shader_vertex2d',
             url: '/data/gl/2d_vertex.js',
             shaderType: this.gl.VERTEX_SHADER,
@@ -316,7 +442,7 @@ DstEng.prototype.preLoad = function() {
         if (!err) {
             this.startLoader();
         } else {
-            this.cfg.readyCallback(true);
+            this.cfg.readyCallback(false);
         }
     }.bind(this));
 
@@ -372,10 +498,6 @@ DstEng.prototype.onMouseClick = function(cb) {
 };
 
 
-DstEng.prototype.randomInt = function(range) {
-    return Math.floor(Math.random() * range);
-};
-
 DstEng.prototype.addRes = function(name, resource) {
 
     if (this.res.hasOwnProperty(name)) {
@@ -393,32 +515,11 @@ DstEng.prototype.addRes = function(name, resource) {
     return (resource);
 };
 
-
 DstEng.prototype.startLoader = function() {
 
     this.addRes('glPrg', this.createProgram(this.gl, this.res.shader_vertex2d.shader, this.res.shader_fragment2d.shader));
     this.addRes('glPrgSat', this.createProgram(this.gl, this.res.shader_vertex2d.shader, this.res.shader_fragment2d_sat.shader));
 
-    //this.gl.useProgram( this.res.glPrg.program );
-
-    // The idea is to have:
-    // DrawGroups, each member of this group will be drawn using the same program
-    //  - PolyGroups, each member will be drawn using the same program and vertex geometry
-    //     - TexGroups, each member will be drawn using the same program, vertex, geometry and texture, it will contain an array of texCoord arrays to be used
-    //        - Sprite, each sprite will be drawn at a desired position, using the desired texCoord array, optional array of program params may be supplied
-    // Usage:
-    // Create a vertexbuffers
-    // Create a dg
-    // Create a pg and add to dg
-    // Create a tg and add to pg
-    // Create a sp and add to tg
-    // draw dgs
-
-    // "Add object: thisProgram, thatimage, " = { dg, pg, tg, sp } ?
-
-
-    /*...*/
-
     var texture = new this.Texture(this.gl, {
         img: this.res.img_DstEng,
         cut: [0, 0, 160, 120],
@@ -428,10 +529,9 @@ DstEng.prototype.startLoader = function() {
     });
 
 
-
-
     var drawGroup = new this.DrawGroup(this.gl, this.res.glPrg);
 
+    console.log(this.res);
 
 
     var w = 320,
@@ -488,7 +588,7 @@ DstEng.prototype.startLoader = function() {
 
     var sprite;
 
-    var audio = this.audio;
+    var snd = this.res.snd_click;
 
     this.Sprite.prototype.animate = function() {
         this.pos[0] += this.vx * timeScale;
@@ -497,7 +597,7 @@ DstEng.prototype.startLoader = function() {
         if (this.pos[0] < 0) {
             this.pos[0] = 0;
             this.vx *= -1;
-            audio.play(0);
+            //   snd.play();
             this.frameGridPos[0]++;
             if (this.frameGridPos[0] > 9) {
                 this.frameGridPos[0] = 0;
@@ -534,15 +634,14 @@ DstEng.prototype.startLoader = function() {
 
     for (var i = 0; i < 10; ++i) {
         sprite = new this.Sprite([300, 220]);
-        sprite.frameGridPos = [Math.floor(Math.random() * 10), 0];
-        sprite.vx = Math.random() * 16 - 8;
-        sprite.vy = Math.random() * 16 - 8;
+        sprite.frameGridPos = [Math.floor(Math.random() * 15), 0];
+        sprite.vx = Math.random() * 0.5 - 0.25;
+        sprite.vy = Math.random() * 0.5 - 0.25;
 
         // sprite.animate = animate.bind(sprite);
         brickTexGroup.addSprite(sprite);
     }
 
-
     bricks.addTexGroup(brickTexGroup);
 
     var backgrounds = new this.PolyGroup(polyBuffer);
@@ -561,17 +660,16 @@ DstEng.prototype.startLoader = function() {
     backgrounds.addTexGroup(bgTexSingle);
 
 
-
-
     this.dg = drawGroup;
 
 
-
     this.drawFrame();
     //Say we are ready
     this.cfg.readyCallback(true);
 };
 
+
+//TODO: Rewrite to use vertex arrays for texture coords instead.
 DstEng.prototype.Texture = (function() {
     function Tex(gl, setup) {
 
@@ -704,7 +802,6 @@ DstEng.prototype.drawFrame = function(timeStamp) {
     } else {
         this.state.timeDelta = 16.0;
         this.state.lastTime = performance.now();
-        console.log('aa', this.state.timeDelta, this.state.lastTime);
     }
 
 
@@ -717,7 +814,11 @@ DstEng.prototype.drawFrame = function(timeStamp) {
 
 
     if (timeScale > 10) {
-        console.log('warning, timescale is large', timeScale);
+        console.log('warning, timescale is large (' + timeScale + ') clipping to 10 frames');
+        timeScale = 10;
+    } else if (timeScale < 0.25) {
+        console.log('warning, timescale is very small (' + timeScale + ') clipping to 0.25 frames');
+        timeScale = 0.25;
     }