/**
A **Fresnel** specifies a Fresnel effect for attached {{#crossLink "PhongMaterial"}}PhongMaterials{{/crossLink}}.
<a href="../../examples/#materials_phong_fresnel"><img src="../../assets/images/screenshots/PhongMaterial/fresnelWide.png"></img></a>
## Overview
* Fresnels are grouped within {{#crossLink "PhongMaterial"}}{{/crossLink}}s, which are attached to
{{#crossLink "Mesh"}}Meshes{{/crossLink}}.
## Examples
* [PhongMaterials with Fresnels](../../examples/#materials_phong_fresnel)
## Usage
````javascript
var mesh = new xeogl.Mesh({
material: new xeogl.PhongMaterial({
ambient: [0.3, 0.3, 0.3],
shininess: 30,
diffuseFresnel: new xeogl.Fresnel({
edgeColor: [1.0, 1.0, 1.0],
centerColor: [0.0, 0.0, 0.0],
power: 4,
bias: 0.6
}),
specularFresnel: new xeogl.Fresnel({
edgeColor: [1.0, 1.0, 1.0],
centerColor: [0.0, 0.0, 0.0],
power: 4,
bias: 0.2
})
}),
new xeogl.TorusGeometry()
});
````
@class Fresnel
@module xeogl
@submodule materials
@constructor
@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] {*} Configs
@param [cfg.id] {String} Optional ID, unique among all components in the parent scene, generated automatically when omitted.
@param [cfg.meta] {String:Object} Optional map of user-defined metadata to attach to this Fresnel.
@param [cfg.edgeColor=[ 0.0, 0.0, 0.0 ]] {Array of Number} Color used on edges.
@param [cfg.centerColor=[ 1.0, 1.0, 1.0 ]] {Array of Number} Color used on center.
@param [cfg.edgeBias=0] {Number} Bias at the edge.
@param [cfg.centerBias=1] {Number} Bias at the center.
@param [cfg.power=0] {Number} The power.
@extends Component
*/
import {Component} from '../component.js';
import {State} from '../renderer/state.js';
import {math} from '../math/math.js';
import {componentClasses} from "./../componentClasses.js";
const type = "xeogl.Fresnel";
class Fresnel extends Component {
/**
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({
edgeColor: math.vec3([0, 0, 0]),
centerColor: math.vec3([1, 1, 1]),
edgeBias: 0,
centerBias: 1,
power: 1
});
this.edgeColor = cfg.edgeColor;
this.centerColor = cfg.centerColor;
this.edgeBias = cfg.edgeBias;
this.centerBias = cfg.centerBias;
this.power = cfg.power;
}
/**
This Fresnel's edge color.
@property edgeColor
@default [0.0, 0.0, 0.0]
@type Float32Array
*/
set edgeColor(value) {
this._state.edgeColor.set(value || [0.0, 0.0, 0.0]);
this._renderer.imageDirty();
}
get edgeColor() {
return this._state.edgeColor;
}
/**
This Fresnel's center color.
@property centerColor
@default [1.0, 1.0, 1.0]
@type Float32Array
*/
set centerColor(value) {
this._state.centerColor.set(value || [1.0, 1.0, 1.0]);
this._renderer.imageDirty();
}
get centerColor() {
return this._state.centerColor;
}
/**
* Indicates this Fresnel's edge bias.
*
* @property edgeBias
* @default 0
* @type Number
*/
set edgeBias(value) {
this._state.edgeBias = value || 0;
this._renderer.imageDirty();
}
get edgeBias() {
return this._state.edgeBias;
}
/**
* Indicates this Fresnel's center bias.
*
* @property centerBias
* @default 1
* @type Number
*/
set centerBias(value) {
this._state.centerBias = (value !== undefined && value !== null) ? value : 1;
this._renderer.imageDirty();
}
get centerBias() {
return this._state.centerBias;
}
/**
* Indicates this Fresnel's power.
*
* @property power
* @default 1
* @type Number
*/
set power(value) {
this._state.power = (value !== undefined && value !== null) ? value : 1;
this._renderer.imageDirty();
}
get power() {
return this._state.power;
}
destroy() {
super.destroy();
this._state.destroy();
}
}
componentClasses[type] = Fresnel;
export{Fresnel};