carlmw/gitlactica

View on GitHub
adapters/renderer.js

Summary

Maintainability
A
1 hr
Test Coverage
var scene = require('./webgl/scene'),
    shipYard = require('./webgl/ship_yard'),
    loader = require('./loader'),
    torpedoLauncher = require('./webgl/torpedo_launcher'),
    textureLoader = require('../lib/texture_loader'),
    texturesToLoad = require('./webgl/textures'),
    beam = require('./webgl/beam'),
    system = require('./webgl/system'),
    camera = require('./webgl/camera'),
    explosions = require('./webgl/explosions'),
    _ = require('lodash');

module.exports = function Renderer (channel) {
  var textures = textureLoader(loader, texturesToLoad, ready, fail),
      stage = scene(textures.skybox, textures.star1, textures.star2, textures.star3),
      ships = shipYard(stage.scene),
      launcher = torpedoLauncher(stage.scene, textures.torpedo),
      tractor = torpedoLauncher(stage.scene, textures.torpedo),
      particleBeam = beam(textures.beam),
      planets = system(stage.scene, stage.camera, textures.planet),
      detonate = explosions(stage.scene),
      cam = camera(stage.camera);

  stage.scene.add(launcher.system);
  tractor.system.add(particleBeam);
  hideBeam();

  // TODO move launcher and tractor out of renderer
  return _.extend({}, stage, ships, planets, cam, {
    addTorpedo: launcher.add,
    moveTorpedo: launcher.move,
    extractTorpedo: tractor.add,  
    moveExtractedTorpedo: tractor.move,
    detonateExplosion: detonate,
    addWeapons: addWeapons,
    hideBeam: hideBeam,
    showBeam: showBeam,
    html: function (selector, html) {
      // TODO move this into a DOM adapter
      global.document.querySelector(selector).innerHTML = html;
    },
    addClass: function (selector, className) {
      // TODO move this into a DOM adapter
      global.document.querySelector(selector).className += ' ' + className;
    }
  });

  function addWeapons (name) {
    ships.addObjectToShip(name, tractor.system);
    log('Added weapons to ' + name);
  }

  function hideBeam () {
    particleBeam.visible =  false;
    log('Hidden beam');
  }

  function showBeam () {
    particleBeam.visible = true;
    log('Shown beam');
  }

  function ready () {
    channel.emit('renderer:ready');
  }

  function fail () {
    channel.emit('failure', 'Failed to load one or more textures');
  }
};