r3-legacy/src/game-lib-system-render.js

139 lines
2.7 KiB
JavaScript

/**
* System takes care of updating all the entities (based on their component data)
* @param apiSystem GameLib.API.System
* @constructor
*/
GameLib.System.Render = function(
apiSystem
) {
GameLib.System.call(
this,
apiSystem
);
};
GameLib.System.Render.prototype = Object.create(GameLib.System.prototype);
GameLib.System.Render.prototype.constructor = GameLib.System.Render;
GameLib.System.Render.prototype.start = function() {
this.renderEntities = GameLib.EntityManager.Instance.query(
[
GameLib.D3.Viewport,
GameLib.D3.Scene,
GameLib.D3.Renderer,
GameLib.D3.Camera
]
);
this.renderEntities.map(
function(entity) {
var stats = entity.getFirstComponent(GameLib.D3.Stats);
stats.resize();
stats.domElement.instance.parentElement.appendChild(stats.instance.dom);
}
)
};
/**
* Update script
*/
GameLib.System.Render.prototype.update = function() {
this.renderEntities.map(
function (renderEntity) {
var stats = renderEntity.getFirstComponent(GameLib.D3.Stats);
if (!stats.instance) {
return;
}
var renderer = renderEntity.getFirstComponent(GameLib.D3.Renderer);
var camera = renderEntity.getFirstComponent(GameLib.D3.Camera);
var viewports = renderEntity.getComponents(GameLib.D3.Viewport);
var scenes = renderEntity.getComponents(GameLib.D3.Scene);
if (!renderer.instance) {
return;
}
if (viewports.length > 1) {
renderer.instance.autoClear = false;
}
if (scenes.length > 1) {
renderer.instance.autoClear = false;
}
renderer.instance.clear();
viewports.map(
function (viewport) {
renderer.instance.setViewport(
viewport.x * renderer.width,
viewport.y * renderer.height,
viewport.width * renderer.width,
viewport.height * renderer.height
);
function renderScene(scene) {
if (!scene.instance) {
return;
}
if (scene.activeCamera) {
if (!scene.activeCamera.instance) {
return;
}
renderer.instance.render(
scene.instance,
scene.activeCamera.instance
);
} else {
if (!camera.instance) {
return;
}
renderer.instance.render(
scene.instance,
camera.instance
);
}
}
if (viewport.scenes && viewport.scenes.length > 0) {
viewport.scenes.map(renderScene);
} else {
scenes.map(renderScene);
}
}
);
stats.instance.end();
}
);
};
GameLib.System.Render.prototype.stop = function() {
this.renderEntities.map(
function(entity) {
var stats = entity.getFirstComponent(GameLib.D3.Stats);
stats.domElement.instance.parentElement.removeChild(stats.instance.dom);
}
);
this.renderEntities = [];
};