185 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  **      ==============================
 | |
|  **       O           O      O   OOOO
 | |
|  **       O           O     O O  O   O
 | |
|  **       O           O     O O  O   O
 | |
|  **       OOOO   OOOO O     OOO  OOOO
 | |
|  **       O   O       O    O   O O   O
 | |
|  **       O   O       O    O   O O   O
 | |
|  **       OOOO        OOOO O   O OOOO
 | |
|  **      ==============================
 | |
|  **      Dr. Stefan Bosse http://www.bsslab.de
 | |
|  **
 | |
|  **      COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED
 | |
|  **                 BY THE AUTHOR(S).
 | |
|  **                 THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED,
 | |
|  **                 MODIFIED, OR OTHERWISE USED IN A CONTEXT
 | |
|  **                 OUTSIDE OF THE SOFTWARE SYSTEM.
 | |
|  **
 | |
|  **    $AUTHORS:     Stefan Bosse
 | |
|  **    $INITIAL:     (C) 2006-2019 bLAB
 | |
|  **    $CREATED:     21-04-17 by sbosse.
 | |
|  **    $VERSION:     1.3.1
 | |
|  **
 | |
|  **    $INFO:
 | |
|  **
 | |
|  **  Physical Multi-body Simulator that can be combined with MAS simulation
 | |
|  **
 | |
|  **  Physical scene constructor function type signature:
 | |
|  **
 | |
|  **  function constructor(world:{CANNON,GUI,..},settings:{$p:$v},log:function) -> {map?:function, destroy?:function, ..}
 | |
|  **
 | |
|  **    $ENDOFINFO
 | |
|  */
 | |
| 
 | |
| var Comp = Require('com/compat');
 | |
| var util = Require('util');
 | |
| var current=none;
 | |
| var Aios = none;
 | |
| var DSP = Require('dsp/dsp');
 | |
| 
 | |
| var simu = function (options) {
 | |
|   this.CANNON=options.CANNON;
 | |
|   this.UI=options.UI;
 | |
|   this.options=options;
 | |
|   this.options.width=options.width||100;
 | |
|   this.options.height=options.height||100;
 | |
|   this.log = options.log || console.log;
 | |
|   
 | |
|   this.gui = new this.CANNON.Gui({width:this.options.width,
 | |
|                                   height:this.options.height,
 | |
|                                   log:this.log,
 | |
|                                   display:options.display});
 | |
|   this.objects=[];
 | |
|   this.selected=none;
 | |
| }
 | |
| 
 | |
| /** Add a physical world scene defining physical and visual objects incl. constraints.
 | |
|  *
 | |
|  */
 | |
| simu.prototype.addScene = function (name,constructor,settings) {
 | |
|   var self=this, 
 | |
|       gui = this.gui,
 | |
|       CANNON = this.CANNON,      
 | |
|       world = this.world;
 | |
|   this.objects=[];
 | |
|   this.scene=_;
 | |
|   if (!settings) settings={};
 | |
|   // Pass MAS simulation model to physical model constructor
 | |
|   settings.model=this.options.model;
 | |
|   gui.addScene(name,function(options){
 | |
|     for(var p in options) settings[p]=options[p];
 | |
|     // remove old scene bindings (listeners ..)
 | |
|     if (self.objects && self.objects.destroy) self.objects.destroy();
 | |
|     self.objects=constructor(world,settings,self.log);
 | |
|     self.scene=name;
 | |
|     return;
 | |
|   });
 | |
| }
 | |
| 
 | |
| /** Show a scene by name
 | |
|  *
 | |
|  */
 | |
| simu.prototype.changeScene = function (name,settings) {
 | |
|   this.gui.scenePicker[name](settings);
 | |
| }
 | |
| 
 | |
| simu.prototype.destroy = function () {
 | |
|   if (this.gui) this.gui.destroy();
 | |
|   this.gui=none;
 | |
|   this.wolrd=none;
 | |
|   this.selected=none;
 | |
| }
 | |
| 
 | |
| simu.prototype.get = function (id) {
 | |
|   if (this.objects && this.objects.map) 
 | |
|   try {
 | |
|     return this.objects.map(id);
 | |
|   } catch (e) {return none};
 | |
| }
 | |
| 
 | |
| simu.prototype.init = function () {
 | |
|   this.gui.init();
 | |
|   this.gui.enable();
 | |
|   this.gui.animate();
 | |
|   this.gui.disable();
 | |
|   this.world = this.gui.getWorld();
 | |
|   this.world.CANNON=this.CANNON;
 | |
|   this.world.GUI=this.gui;
 | |
|   this.world.DSP=DSP;
 | |
| }
 | |
| 
 | |
| simu.prototype.refresh = function (steps) {
 | |
|   this.gui.checkRender();
 | |
| }
 | |
| 
 | |
| // Try to get a report from a scene
 | |
| simu.prototype.report = function (name) {
 | |
|   if (!name) name=this.scene;
 | |
|   if (this.scene && this.objects.report) 
 | |
|     try { return  this.objects.report() }
 | |
|     catch (e) { this.gui.log('report: '+e.toString()) } 
 | |
| }
 | |
| 
 | |
| simu.prototype.select = function (id) {
 | |
|   var obj,shape;
 | |
|   if (this.selected) {
 | |
|     this.selected.shape.color=this.selected.color; 
 | |
|     this.gui.setMaterial(this.selected.shape);
 | |
|     this.selected=none;
 | |
|   }
 | |
|   if (this.objects && this.objects.map) {
 | |
|     obj = this.objects.map(id);
 | |
|     if (obj && obj.shapes && obj.shapes[0]) {
 | |
|       shape=obj.shapes[0];
 | |
|       // this.log(util.inspect(shape));
 | |
|       if (shape.mesh) {
 | |
|         this.selected={shape:shape.mesh,color:shape.mesh.color||'white'};
 | |
|         shape.mesh.color = 'red';
 | |
|         this.gui.setMaterial(shape.mesh);
 | |
|       }
 | |
|       this.gui.checkRender();
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| simu.prototype.start = function (steps) {
 | |
| 
 | |
| }
 | |
| 
 | |
| simu.prototype.step = function (steps,callback) { 
 | |
|   this.gui.enable();
 | |
|   return this.gui.step(steps,callback);
 | |
| }
 | |
| 
 | |
| simu.prototype.stepPhyOnly = function (steps,callback) { 
 | |
|   this.gui.stepPhyOnly(steps,callback);
 | |
| }
 | |
| 
 | |
| simu.prototype.stop = function (steps) {
 | |
| 
 | |
| }
 | |
| 
 | |
| simu.prototype.unselect = function () {
 | |
|   if (this.selected) {
 | |
|     this.selected.shape.color=this.selected.color; 
 | |
|     this.gui.setMaterial(this.selected.shape);
 | |
|     this.selected=none;
 | |
|     this.gui.checkRender();
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| var Simu = function(options) {
 | |
|   var obj=none;
 | |
|   obj = new simu(options);
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|   simu:simu,
 | |
|   Simu:Simu,
 | |
|   current:function (module) { current=module.current; Aios=module; JamAnal.current(module)}
 | |
| }
 | |
| 
 |