import Node from './Node';
import glenum from './core/glenum';
/**
* @constructor
* @alias clay.Renderable
* @extends clay.Node
*/
var Renderable = Node.extend(/** @lends clay.Renderable# */ {
/**
* @type {clay.Material}
*/
material: null,
/**
* @type {clay.Geometry}
*/
geometry: null,
/**
* @type {number}
*/
mode: glenum.TRIANGLES,
_renderInfo: null
},
/** @lends clay.Renderable.prototype */
{
__program: null,
/**
* Group of received light.
*/
lightGroup: 0,
/**
* Render order, Nodes with smaller value renders before nodes with larger values.
* @type {Number}
*/
renderOrder: 0,
/**
* Used when mode is LINES, LINE_STRIP or LINE_LOOP
* @type {number}
*/
// lineWidth: 1,
/**
* If enable culling
* @type {boolean}
*/
culling: true,
/**
* Specify which side of polygon will be culled.
* Possible values:
* + {@link clay.Renderable.BACK}
* + {@link clay.Renderable.FRONT}
* + {@link clay.Renderable.FRONT_AND_BACK}
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/cullFace
* @type {number}
*/
cullFace: glenum.BACK,
/**
* Specify which side is front face.
* Possible values:
* + {@link clay.Renderable.CW}
* + {@link clay.Renderable.CCW}
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/frontFace
* @type {number}
*/
frontFace: glenum.CCW,
/**
* If enable software frustum culling
* @type {boolean}
*/
frustumCulling: true,
/**
* @type {boolean}
*/
receiveShadow: true,
/**
* @type {boolean}
*/
castShadow: true,
/**
* @type {boolean}
*/
ignorePicking: false,
/**
* @type {boolean}
*/
ignorePreZ: false,
/**
* @type {boolean}
*/
ignoreGBuffer: false,
/**
* @return {boolean}
*/
isRenderable: function() {
// TODO Shader ?
return this.geometry && this.material && this.material.shader && !this.invisible
&& this.geometry.vertexCount > 0;
},
/**
* Before render hook
* @type {Function}
*/
beforeRender: function (_gl) {},
/**
* Before render hook
* @type {Function}
*/
afterRender: function (_gl, renderStat) {},
getBoundingBox: function (filter, out) {
out = Node.prototype.getBoundingBox.call(this, filter, out);
if (this.geometry && this.geometry.boundingBox) {
out.union(this.geometry.boundingBox);
}
return out;
},
/**
* Clone a new renderable
* @function
* @return {clay.Renderable}
*/
clone: (function() {
var properties = [
'castShadow', 'receiveShadow',
'mode', 'culling', 'cullFace', 'frontFace',
'frustumCulling',
'renderOrder', 'lineWidth',
'ignorePicking', 'ignorePreZ', 'ignoreGBuffer'
];
return function() {
var renderable = Node.prototype.clone.call(this);
renderable.geometry = this.geometry;
renderable.material = this.material;
for (var i = 0; i < properties.length; i++) {
var name = properties[i];
// Try not to overwrite the prototype property
if (renderable[name] !== this[name]) {
renderable[name] = this[name];
}
}
return renderable;
};
})()
});
/**
* @type {number}
*/
Renderable.POINTS = glenum.POINTS;
/**
* @type {number}
*/
Renderable.LINES = glenum.LINES;
/**
* @type {number}
*/
Renderable.LINE_LOOP = glenum.LINE_LOOP;
/**
* @type {number}
*/
Renderable.LINE_STRIP = glenum.LINE_STRIP;
/**
* @type {number}
*/
Renderable.TRIANGLES = glenum.TRIANGLES;
/**
* @type {number}
*/
Renderable.TRIANGLE_STRIP = glenum.TRIANGLE_STRIP;
/**
* @type {number}
*/
Renderable.TRIANGLE_FAN = glenum.TRIANGLE_FAN;
/**
* @type {number}
*/
Renderable.BACK = glenum.BACK;
/**
* @type {number}
*/
Renderable.FRONT = glenum.FRONT;
/**
* @type {number}
*/
Renderable.FRONT_AND_BACK = glenum.FRONT_AND_BACK;
/**
* @type {number}
*/
Renderable.CW = glenum.CW;
/**
* @type {number}
*/
Renderable.CCW = glenum.CCW;
export default Renderable;