blob: 1c60595bee0985cae68e4416ba6a22164ecd994a [file] [log] [blame]
function ThreejsRenderer(animationItem, config){
this.animationItem = animationItem;
this.layers = null;
this.renderedFrame = -1;
this.globalData = {
frameNum: -1
};
this.pendingElements = [];
this.elements = [];
this.threeDElements = [];
this.destroyed = false;
this.camera = null;
this.supports3d = true;
}
extendPrototype(BaseRenderer,ThreejsRenderer);
ThreejsRenderer.prototype.buildItem = SVGRenderer.prototype.buildItem;
ThreejsRenderer.prototype.checkPendingElements = function(){
while(this.pendingElements.length){
var element = this.pendingElements.pop();
element.checkParenting();
}
};
ThreejsRenderer.prototype.appendElementInPos = function(element, pos){
var newElement = element.getBaseElement();
if(!newElement){
return;
}
var layer = this.layers[pos];
if(!layer.ddd || !this.supports3d){
var i = 0;
var nextElement;
while(i<pos){
if(this.elements[i] && this.elements[i]!== true && this.elements[i].getBaseElement){
nextElement = this.elements[i].getBaseElement();
}
i += 1;
}
if(nextElement){
if(!layer.ddd || !this.supports3d){
this.layerElement.insertBefore(newElement, nextElement);
}
} else {
if(!layer.ddd || !this.supports3d){
this.layerElement.appendChild(newElement);
}
}
} else {
this.scene.add( newElement );
}
};
ThreejsRenderer.prototype.createSolid = function (data) {
return new TSolidElement(data, this.layerElement,this.globalData,this);
};
ThreejsRenderer.prototype.createImage = function (data) {
return new TImageElement(data, this.layerElement,this.globalData,this);
};
ThreejsRenderer.prototype.createCamera = function (data) {
this.camera = new TCameraElement(data, this.layerElement,this.globalData,this);
return this.camera;
};
ThreejsRenderer.prototype.configAnimation = function(animData){
var wrapper = this.animationItem.wrapper;
var scene = new THREE.Scene();
var renderer = new THREE.WebGLRenderer();
renderer.setSize( animData.w, animData.h );
wrapper.appendChild( renderer.domElement );
var svg = document.createElementNS(svgNS,'svg');
svg.setAttribute('width','1');
svg.setAttribute('height','1');
styleDiv(svg);
wrapper.appendChild(svg);
var defs = document.createElementNS(svgNS,'defs');
svg.appendChild(defs);
this.globalData.defs = defs;
this.data = animData;
//Mask animation
this.globalData.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
this.globalData.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
this.globalData.elementLoaded = this.animationItem.elementLoaded.bind(this.animationItem);
this.globalData.frameId = 0;
this.globalData.compSize = {
w: animData.w,
h: animData.h
};
this.globalData.frameRate = animData.fr;
this.layers = animData.layers;
this.globalData.fontManager = new FontManager();
this.globalData.fontManager.addChars(animData.chars);
this.globalData.fontManager.addFonts(animData.fonts,svg);
this.scene = scene;
this.renderer = renderer;
};
ThreejsRenderer.prototype._renderLayersFrame = SVGRenderer.prototype.renderFrame;
ThreejsRenderer.prototype.renderFrame = function(num) {
this._renderLayersFrame(num);
//this.scene.updateMatrixWorld( true );
this.renderer.render(this.scene, this.camera.threeCamera);
}
ThreejsRenderer.prototype.searchExtraCompositions = function(assets){
var i, len = assets.length;
var floatingContainer = document.createElement('div');
for(i=0;i<len;i+=1){
if(assets[i].xt){
var comp = this.createComp(assets[i],floatingContainer,this.globalData.comp,null);
comp.initExpressions();
this.globalData.projectInterface.registerComposition(comp);
}
}
};