let rectangle = require('./map-rectangle-methods.js');
let line = require('./map-line-methods.js');
let polygon = require('./map-polygon-methods.js');
let arc = require('./map-circle-methods.js');
let container = require('./map-container-methods.js');
let tilemap = require('./map-tilemap-methods.js');
let matterBody = require('./map-matterBody-methods.js');
let segmentCount = require('./segmentsCount.js');
let boundingBox = require('./boundingBox.js');
/**
* Configure map.
*
* @method Raycaster.Map#config
* @memberof Raycaster.Map
* @instance
* @since 0.6.0
*
* @param {object} [options] - Map's congfiguration options. May include:
* @param {object} options.object - Game object to map
* @param {string} [options.type] - Map type. If not defined, it will be determined based on object.
* @param {boolean} [options.dynamic = false] - If set true, map will be dynamic (updated on scene update event).
* @param {boolean} [options.active = true] - If set true, map will be active (will provide points, segments and will be updated).
* @param {number} [options.segmentCount] - Circle map's segment count. If set to 0, map won't be generating segments and relay only on tangent points calculated for currently testing ray.
* @param {object} [options.mapChild] - Container's child. If set, only set child will be mapped.
* @param {boolean} [options.forceConvex] - If set true, matter body map will use convex body (hull) for non-covex bodies.
* @param {boolean} [options.forceVerticesMapping] - If set true, matter body map will use only vertices for mapping circle bodies.
*
* @return {Raycaster.Map} {@link Raycaster.Map Raycaster.Map} instance
*/
export function config(options) {
this.object = options.object;
//object type
if(options.type === undefined)
options.type = options.object.type;
if(options.type === 'body' || options.type === 'composite')
options.type = 'MatterBody';
this.type = options.type;
switch(options.type) {
case 'Polygon':
this.getPoints = polygon.getPoints;
this.getSegments = polygon.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = polygon.updateMap;
break;
case 'Arc':
//circle segments count
this.segmentCount = (options.segmentCount) ? options.segmentCount : 0;
this.circle = (options.segmentCount) ? false : true;
this.getPoints = arc.getPoints;
this.getSegments = arc.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = arc.updateMap;
this.setSegmentCount = segmentCount.setSegmentCount;
break;
case 'Line':
this.getPoints = line.getPoints;
this.getSegments = line.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = line.updateMap;
break;
case 'Container':
//container's child
this.mapChild = (options.mapChild) ? options.mapChild : null;
//circle segments count
this.segmentCount = (options.segmentCount) ? options.segmentCount : 0;
//transformed container's circle children
this._circles = [];
this.getPoints = container.getPoints;
this.getSegments = container.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = container.updateMap;
this._updateChildMap = container._updateChildMap;
this.setSegmentCount = segmentCount.setSegmentCount;
break;
case 'StaticTilemapLayer':
//ray colliding tiles
this.collisionTiles = (options.collisionTiles) ? options.collisionTiles : [];
this.getPoints = tilemap.getPoints;
this.getSegments = tilemap.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = tilemap.updateMap;
this.setCollisionTiles = tilemap.setCollisionTiles;
//reset tilemap origin
this.object.setOrigin(0,0);
break;
case 'DynamicTilemapLayer':
//ray colliding tiles
this.collisionTiles = (options.collisionTiles) ? options.collisionTiles : [];
this.getPoints = tilemap.getPoints;
this.getSegments = tilemap.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = tilemap.updateMap;
this.setCollisionTiles = tilemap.setCollisionTiles;
//reset tilemap origin
this.object.setOrigin(0,0);
break;
case 'TilemapLayer':
//ray colliding tiles
this.collisionTiles = (options.collisionTiles) ? options.collisionTiles : [];
this.getPoints = tilemap.getPoints;
this.getSegments = tilemap.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = tilemap.updateMap;
this.setCollisionTiles = tilemap.setCollisionTiles;
//reset tilemap origin
this.object.setOrigin(0,0);
break;
case 'MatterBody':
//force convex body (hull) mapping
this.forceConvex = (options.forceConvex) ? true : false;
//force mapping by vertices
this.forceVerticesMapping = (options.forceVerticesMapping) ? true : false;
this.circle = false;
this.getPoints = matterBody.getPoints;
this.getSegments = matterBody.getSegments;
this.getBoundingBox = matterBody.getBoundingBox;
this.updateMap = matterBody.updateMap;
break;
default:
this.getPoints = rectangle.getPoints;
this.getSegments = rectangle.getSegments;
this.getBoundingBox = boundingBox.getBoundingBox;
this.updateMap = rectangle.updateMap;
}
//if object is not supported
if(this.type != 'MatterBody' && typeof this.object.getBounds !== 'function') {
this.notSupported = true;
}
//dynamic map
this.dynamic = (options.dynamic == true) ? true : false;
//enable/disable map
this.active = (options.active !== undefined) ? options.active : true;
return this;
}