API Docs for:

File: /home/lindsay/xeolabs/xeogl-next/xeogl/src/materials/outlineMaterial.js

/**
 An **OutlineMaterial** is a {{#crossLink "Material"}}{{/crossLink}} that's applied to {{#crossLink "Mesh"}}Meshes{{/crossLink}}
 to render an outline around them.

 WIP

 @class OutlineMaterial
 @module xeogl
 @submodule materials
 @constructor
 @extends Material
 @param [owner] {Component} Owner component. When destroyed, the owner will destroy this component as well. Creates this component within the default {{#crossLink "Scene"}}{{/crossLink}} when omitted.
 @param [cfg] {*} The OutlineMaterial configuration
 @param [cfg.id] {String} Optional ID, unique among all components in the parent {{#crossLink "Scene"}}Scene{{/crossLink}}, generated automatically when omitted.
 @param [cfg.meta=null] {String:Object} Metadata to attach to this OutlineMaterial.
 @param [cfg.color=[1.0,0.2,0.2]] {Array of Number}  Outline RGB color.
 @param [cfg.alpha=1.0] {Number} Outline opacity. A value of 0.0 indicates fully transparent, 1.0 is fully opaque.
 @param [cfg.width=4] {Number}  Outline width, in pixels.
 */
import {core} from "./../core.js";
import {Material} from './material.js';
import {State} from '../renderer/state.js';
import {componentClasses} from "./../componentClasses.js";

const type = "xeogl.OutlineMaterial";

class OutlineMaterial extends Material {

    /**
     JavaScript class name for this Component.

     For example: "xeogl.AmbientLight", "xeogl.MetallicMaterial" etc.

     @property type
     @type String
     @final
     */
    get type() {
        return type;
    }

    init(cfg) {

        super.init(cfg);

        this._state = new State({
            type: "OutlineMaterial",
            color: null,
            alpha: null,
            width: null
        });
        this.color = cfg.color;
        this.alpha = cfg.alpha;
        this.width = cfg.width;
    }

    /**
     RGB outline color.

     @property color
     @default [1.0, 0.2, 0.2]
     @type Float32Array
     */
    set color(value) {
        let color = this._state.color;
        if (!color) {
            color = this._state.color = new Float32Array(3);
        } else if (value && color[0] === value[0] && color[1] === value[1] && color[2] === value[2]) {
            return;
        }
        if (value) {
            color[0] = value[0];
            color[1] = value[1];
            color[2] = value[2];
        } else {
            color[0] = 1.0;
            color[1] = 0.2;
            color[2] = 0.2;
        }
        this._renderer.imageDirty();
    }

    get color() {
        return this._state.color;
    }

    /**
     Outline transparency.

     A value of 0.0 indicates fully transparent, 1.0 is fully opaque.

     @property alpha
     @default 1.0
     @type Number
     */
    set alpha(value) {
        value = (value !== undefined && value !== null) ? value : 1.0;
        if (this._state.alpha === value) {
            return;
        }
        this._state.alpha = value;
        this._renderer.imageDirty();
    }

    get alpha() {
        return this._state.alpha;
    }

    /**
     Outline width in pixels.

     @property width
     @default 4.0
     @type Number
     */
    set width(value) {
        this._state.width = value || 4.0;
        this._renderer.imageDirty();
    }

    get width() {
        return this._state.width;
    }

    destroy() {
        super.destroy();
        this._state.destroy();
    }
}

componentClasses[type] = OutlineMaterial;

export{OutlineMaterial};