Threejs - Deck Prototype6 - Staggered

by black strings

HTML

<script src="https://rawgit.com/mrdoob/three.js/dev/build/three.js"></script>
<script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/controls/OrbitControls.js"></script>
<div id="con">
  <button id="rotateBtn45Pos"> Rotate_45_pos </button>
  <button id="rotateBtn45Neg"> Rotate_45_neg </button>
  <button id="rotateBtnVertical"> Rotate_Vertical </button>
  <button id="rotateBtnHorizontal"> Rotate_Horizontal </button>
</div>
<!--
<img id='testImg' src='https://www.webkit.org/blog-files/acid3-100.png'>-->

CSS

/*div{
    height: 619px;
    width: 780px;
    background-image: url(https://www.webkit.org/blog-files/acid3-100.png);
}*/
img {
  display:none;
}

JavaScript

var mod = {};
var objects = []; 
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 35, window.innerWidth/window.innerHeight, 0.1, 3000 );
var renderer = new THREE.WebGLRenderer();
renderer.shadowMap.enabled = true;   //req for shadow enabling
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
      
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setClearColor( 0xcccccc, 1 ); 
document.body.appendChild( renderer.domElement );
scene.add(camera);

var light1 = createSun();
light1.control.rotation.y += THREE.Math.degToRad(90);
light1.sun.intensity = 1.5;

var light2 = createSun();
light2.control.rotation.z += THREE.Math.degToRad(180);
light2.control.rotation.y += THREE.Math.degToRad(90);
light2.sun.intensity = 1.5;

controls = new THREE.OrbitControls(camera);
setToFullOrbit(controls)
camera.position.copy(new THREE.Vector3(125,125,125));
// fix first frame render issue going invisible
camera.lookAt(new THREE.Vector3(0,0,0));

var axisHelper = new THREE.AxisHelper(12);
scene.add(axisHelper);

// ---------------------- playground starts here ----------------------

//custom texture
//var deckCustomTexture = loadTextureUsingImageDomHack(fti(2));
var deckTexture = new THREE.Texture();

// loadTextureUsingImageDomHack(fti(2));
var levelTexture = new THREE.Texture(); 
//loadTextureUsingImageDomHack(fti(2), true);
var matrix = new THREE.Matrix4();

// ground
var planeGeo = new THREE.PlaneBufferGeometry(400,300);
var groundMat = new THREE.MeshBasicMaterial(
	{ color:0x00ff00}
  );
var planeMesh = new THREE.Mesh(planeGeo, groundMat);
planeMesh.position.x += 90
planeMesh.position.z += 90
planeMesh.rotateX(THREE.Math.degToRad(-90));
scene.add(planeMesh);
rotateUVonPlanar(0, planeMesh);	// works if called right after
//planeMesh.receiveShadow = true;

//apply loaded texture to ground
var groundMatCallBack = function(base64Str){
  var groundImg = new Image();
  groundImg.addEventListener('load', function(){
    var groundTexture = ...