/*
* File: ShadowReceiver.js
* Shadow support
*
* Instance variables:
* mReceiver: Reference to any GameObject
* Treats this target for shadow receiver
* mCasters: Reference to an array of Renderables that are at least LightRenderable
*
* Draws the mReceiver, and the shadows of mCasters on this mReceiver
*/
/*jslint node: true, vars: true, white: true */
/*global gEngine, Renderable, SpriteRenderable, ShadowCaster, Transform */
/* find out more about jslint: http://www.jslint.com/help.html */
"use strict"; // Operate in Strict mode such that variables must be declared before used!
function ShadowReceiver (theReceiverObject) {
this.kShadowStencilBit = 0x01; // The stencil bit to switch on/off for shadow
this.kShadowStencilMask = 0xFF; // The stencil mask
this.mReceiverShader = gEngine.DefaultResources.getShadowReceiverShader();
this.mReceiver = theReceiverObject;
// To support shadow drawing
this.mShadowCaster = []; // array of ShadowCasters
}
//
ShadowReceiver.prototype.addShadowCaster = function (lgtRenderable) {
var c = new ShadowCaster(lgtRenderable, this.mReceiver);
this.mShadowCaster.push(c);
};
// for now, cannot remove shadow casters
//
//
ShadowReceiver.prototype.draw = function (aCamera) {
var c;
// draw receiver as a regular renderable
this.mReceiver.draw(aCamera);
this._shadowRecieverStencilOn();
var s = this.mReceiver.getRenderable().swapShader(this.mReceiverShader);
this.mReceiver.draw(aCamera);
this.mReceiver.getRenderable().swapShader(s);
this._shadowRecieverStencilOff();
// now draw shadow color to the pixels in the stencil that are switched on
for (c = 0; c < this.mShadowCaster.length; c++) {
this.mShadowCaster[c].draw(aCamera);
}
// switch off stencil checking
this._shadowRecieverStencilDisable();
};
//
ShadowReceiver.prototype.update = function () {
this.mReceiver.update();
};
//