// Amira Abdel-Rahman
// (c) Massachusetts Institute of Technology 2020

///////////call from node app.js code///////////////
// wait for the rhino3dm web assembly to load asynchronously
// rhino3dm().then(function(m) {// todo change call to app.js
// 	_rhino3dm = m; // global
// 	initRhino3dm(1,10,createVoxel,true,true);
// 	saveJSON();
// });
/////////////////////////////////////

var setup=JSON.parse(JSON.stringify(setupEmpty));

var latticeSize=4;
var voxelSize=5.0;


rhino3dm().then(async m => {
    console.log('Loaded rhino3dm.');

    // document.getElementById("footer2").innerHTML = "Loaded rhino3dm.";
    _rhino3dm = m; // global

    var material={
		area:2.38*2.38,
		density:0.028,
		stiffness:3000
    };

    var material2={
		area:2.38*2.38,
		density:0.028,
		stiffness:500
    };
    

    setup.hierarchical=false;
    setup.voxelSize=voxelSize;

    const position=new THREE.Vector3(0,0,0);

    ///
    var support=new _rhino3dm.BoundingBox(
        [
            -voxelSize/2+position.x,
            -voxelSize/2+position.y,
            -voxelSize/2+position.z
        ], [
            voxelSize/2+position.x,
            voxelSize/2+position.y,
            voxelSize/2+position.z
        ]);
    
    // var tendons=[];
    

    var temp=voxelSize*(latticeSize);
    var load=new _rhino3dm.BoundingBox(
        [
            -voxelSize/2+position.x,
            -voxelSize/2+position.y+voxelSize/4,
            temp+position.z+voxelSize/4
        ], 
        [
            -voxelSize/2+position.x+voxelSize/4,
            voxelSize/2+position.y-voxelSize/4,
            temp+voxelSize/2+position.z
    ]);
    var load1=new _rhino3dm.BoundingBox(
        [
            voxelSize/2+position.x,
            -voxelSize/2+position.y+voxelSize/4,
            -voxelSize/2+position.z
        ],     
        [
            voxelSize/2+position.x+voxelSize/4,
            voxelSize/2+position.y-voxelSize/4,
            temp+voxelSize/2+position.z
    ]);
    var dof=[true,true,true,true,true,true];
    var supports=[[support,dof]];
    var loads=[[load1,{x:0.0,y:0,z:-0.1}]];
    

    

    ///

    setup.supports=[
        [{
            min:[
                support.min[0],
                support.min[1],
                support.min[2]
            ],
            max:[
                support.max[0],
                support.max[1],
                support.max[2]
            ]
        }]
    ];

    setup.loads=[
        // [{
        //     min:[
        //         load.min[0],
        //         load.min[1],
        //         load.min[2]
        //     ],
        //     max:[
        //         load.max[0],
        //         load.max[1],
        //         load.max[2]
        //     ]
        // }],
        [{
            min:[
                load1.min[0],
                load1.min[1],
                load1.min[2]
            ],
            max:[
                load1.max[0],
                load1.max[1],
                load1.max[2]
            ]
        }]
    ];
    

    lateralLoadSetup(setup,position,latticeSize+1,voxelSize,createVoxel,supports,loads,material);

    var temp=voxelSize*(latticeSize+1)-voxelSize;
    var mat1=new _rhino3dm.BoundingBox(
        [
            -voxelSize/2+position.x-voxelSize/4,
            -voxelSize/2+position.y,
            -voxelSize/2+position.z
        ], 
        [
            -voxelSize/2+position.x+voxelSize/4,
            voxelSize/2+position.y,
            voxelSize/2+position.z+temp
    ]);
    var mat2=new _rhino3dm.BoundingBox(
        [
            voxelSize/2+position.x-voxelSize/4,
            -voxelSize/2+position.y,
            -voxelSize/2+position.z
        ], 
        [
            voxelSize/2+position.x+voxelSize/4,
            voxelSize/2+position.y,
            voxelSize/2+position.z+temp
    ]);
    var diffMaterialBox=[[mat1,material2],[mat2,material2]];
    changeMaterialFromBox(setup,diffMaterialBox);

    setup.mat=[
        [{
            min:[
                mat1.min[0],
                mat1.min[1],
                mat1.min[2]
            ],
            max:[
                mat1.max[0],
                mat1.max[1],
                mat1.max[2]
            ]
        }],
        [{
            min:[
                mat2.min[0],
                mat2.min[1],
                mat2.min[2]
            ],
            max:[
                mat2.max[0],
                mat2.max[1],
                mat2.max[2]
            ]
        }]
    ];
    

    

    for (var i=4;i<=latticeSize;i++){
        // var temp=voxelSize*i-voxelSize;
        var temp=voxelSize*1-voxelSize;
        var load=new _rhino3dm.BoundingBox(
            [
                -voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ], 
            [
                -voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var load1=new _rhino3dm.BoundingBox(
            [
                voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ],     
            [
                voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var temp=voxelSize*(i+1)-voxelSize;
        var load_1=new _rhino3dm.BoundingBox(
            [
                -voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ], 
            [
                -voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var load1_1=new _rhino3dm.BoundingBox(
            [
                voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ],     
            [
                voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);

        
        var id1=idFromBox(setup,load);
        var id2=idFromBox(setup,load_1);
        if(id1.length>0&&id2.length>0){
            var E=0;
            // addEdge(setup,id2[0], id1[0], material.area, material.density , E);
            // setup.edges[setup.edges.length-1].loaded=(latticeSize-i)*-100;

        }

        var id1=idFromBox(setup,load1);
        var id2=idFromBox(setup,load1_1);
        if(id1.length>0&&id2.length>0){
            var E=1;
            addEdge(setup,id2[0], id1[0], material.area, material.density , E);
            setup.edges[setup.edges.length-1].loaded=0.5;

        }
    
    }

    for (var i=1;i<=latticeSize;i++){
        var temp=voxelSize*i-voxelSize;
        var load=new _rhino3dm.BoundingBox(
            [
                -voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ], 
            [
                -voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var load1=new _rhino3dm.BoundingBox(
            [
                voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ],     
            [
                voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var temp=voxelSize*(i+1)-voxelSize;
        var load_1=new _rhino3dm.BoundingBox(
            [
                -voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ], 
            [
                -voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var load1_1=new _rhino3dm.BoundingBox(
            [
                voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ],     
            [
                voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);

        //down tendons
        var id1=idFromBox(setup,load);
        var id2=idFromBox(setup,load_1);
        if(id1.length>0&&id2.length>0){
            var E=1;
            // addEdge(setup,id2[0], id1[0], material.area, material.density , E);
            // setup.edges[setup.edges.length-1].loaded=(latticeSize-i)*-100;

        }

        //up tendons
        var id1=idFromBox(setup,load1);
        var id2=idFromBox(setup,load1_1);
        if(id1.length>0&&id2.length>0){
            var E=1;
            addEdge(setup,id2[0], id1[0], material.area, material.density , E);
            setup.edges[setup.edges.length-1].loaded=i*i*i*0.3;
        }
    }

    for (var i=1;i<=latticeSize;i++){
        var temp=voxelSize*i-voxelSize;
        var load=new _rhino3dm.BoundingBox(
            [
                -voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ], 
            [
                -voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var load1=new _rhino3dm.BoundingBox(
            [
                voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ],     
            [
                voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var temp=voxelSize*(i+1)-voxelSize;
        var load_1=new _rhino3dm.BoundingBox(
            [
                -voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ], 
            [
                -voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);
        var load1_1=new _rhino3dm.BoundingBox(
            [
                voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4
            ],     
            [
                voxelSize/2+position.x+voxelSize/4,
                voxelSize/2+position.y-voxelSize/4,
                temp+voxelSize/2+position.z
        ]);


        //perpendicular tendons
        var id1=idFromBox(setup,load_1);
        var id2=idFromBox(setup,load1_1);
        if(id1.length>0&&id2.length>0){
            var E=1;
            addEdge(setup,id2[0], id1[0], material.area, material.density , E);
            setup.edges[setup.edges.length-1].loaded=-i*i*i*0.5;

        }
    }

   

    ////////////////////////////////////
    

    setup.floorEnabled=false;
    setup.gravityEnabled=false;
    setup.staticSimulation=true;
    setup.poisson=false;
    setup.scale=1;
    setup.linear=true;  
    setup.globalDamping=0.2;


    

    saveJSON()


});