Source: loop/update.js

const PhSim = require("..");

// Try to import matter-js as a commonJS module

var Matter;

if(typeof window === "object") {
	Matter = window.Matter;
}

else {
	Matter = require("matter-js");
}

/**
 * 
 * Update a dynamic object.
 * 
 * @function
 * @param {PhSimObject} currentObj - Object to be updated
 * @fires PhSim.Events.PhSimEvent
 * 
 */

PhSim.prototype.updateDynObj = function(currentObj) {


	// Loop must start at index 1 because the first element in the array is a reference to the parent object itself.

	if(currentObj.noDyn) {
		this.phRender.renderStatic(currentObj);	
	}
	
	else {

		if(currentObj.shape === "circle" || currentObj.shape === "regPolygon" || currentObj.shape === "rectangle") {
			currentObj.cycle = currentObj.firstCycle + currentObj.matter.angle;
		}
	
		if(currentObj.shape === "rectangle") {
			currentObj.x = currentObj.matter.position.x - currentObj.w * 0.5
			currentObj.y = currentObj.matter.position.y - currentObj.h * 0.5
		}
	
		if(currentObj.shape === "circle" || currentObj.shape === "regPolygon") {
			currentObj.x = currentObj.matter.position.x;
			currentObj.y = currentObj.matter.position.y;
		}
	
		if(currentObj.shape === "polygon") {
			PhSim.calc_skinmesh(currentObj);
		}

		if(this.phRender) {	
			this.phRender.dynamicRenderDraw(currentObj);
		}

	}

	var event = new PhSim.Events.PhSimEvent("objupdate");
	event.target = currentObj;

	this.callEventClass("objupdate",this,event);

}

/**
 * The loopFunction is a function that is executed over and over again. It is responsible
 * for providing the simulation loop.
 */

PhSim.prototype.loopFunction = function() {

	if(this.paused === false && this.status === PhSim.statusCodes.LOADED_SIMULATION) {

		var beforeUpdateEvent = new PhSim.Events.PhSimDynEvent()

		beforeUpdateEvent.simulation = this.simulation;

		this.prevDate = this.prevDate && this.updateDate;
	
		this.callEventClass("beforeupdate",this,beforeUpdateEvent);

		if(!this.firstSlUpdate) {
			this.callEventClass("beforefirstslupdate",this,afterUpdateEvent);
		}

		this.updateDate = new Date();

		if(this.prevDate) {
			this.updateTimeInterval = this.updateDate - this.prevDate;
		}


		Matter.Engine.update(this.matterJSEngine,this.delta);

		if(this.ctx) {

			this.ctx.fillStyle = this.bgFillStyle;

			if(this.noCamera) {
				this.ctx.fillRect(0,0,this.width,this.height);
			}
	
			else {
				this.ctx.fillRect(0 - this.camera.x,0 - this.camera.y,this.width / this.camera.scale,this.height / this.camera.scale);
			}
		}

		for(let i = 0; i < this.objUniverse.length; i++) {
			this.updateDynObj(this.objUniverse[i]);
		}
	
		this.applyGravitationalField()

		var afterUpdateEvent = new PhSim.Events.PhSimDynEvent()

		afterUpdateEvent.simulation = this.simulation;

		this.sl_time = this.sl_time + this.delta;

		if(this.filter) {
			this.ctx.fillStyle = "rgba(3,3,3,0.7)";
			this.ctx.fillRect(0,0,this.width / this.camera.scale,this.height / this.camera.scale);
		}

		if(!this.firstSlUpdate) {
			this.callEventClass("firstslupdate",this,afterUpdateEvent);
			this.firstSlUpdate = true;
		}

		this.callEventClass("afterupdate",this,afterUpdateEvent);

		//this.renderAllCounters();


	}

}