JSFiddle - React, Tailwind, and code Playground

by tolland

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/89/three.min.js"></script>
<script src="https://cdn.rawgit.com/mrdoob/stats.js/r17/build/stats.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.6.5/dat.gui.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<script src="https://cdn.rawgit.com/tolland/THREE.Terrain/43011e7355028ee7fabe070d869b92e7ee48651d/build/THREE.Terrain.js"></script>


  <script>
    var vertShader =
      `
        varying vec2 vPos;
        void main() {
          vPos = position.xz;
          gl_Position = projectionMatrix *
                        modelViewMatrix *
                        vec4(position,1.0);
        }
      `;

    var fragShader =
      `
        uniform vec3 center;
        uniform vec3 start;
        uniform vec3 end;
        uniform vec2 size;
        uniform float lineHalfWidth;
        uniform bool enabled;
        
        varying vec2 vPos;
        
        void main() {
          vec2 Ro = size * .5;
          vec2 Uo = abs( vPos - center.xz ) - Ro;
          
          vec3 c = mix(vec3(1.), vec3(1.,0.,0.), float(enabled && (abs(max(Uo.x,Uo.y)) < lineHalfWidth)  ));
          
          gl_FragColor = vec4(c, float(enabled && (abs(max(Uo.x,Uo.y)) < lineHalfWidth)  ));
        }
        
      `;
      
      var uniforms = {
  center: {
    value: new THREE.Vector3()
  },
  start: {
    value: new THREE.Vector3()
  },
  end: {
    value: new THREE.Vector3()
  },
  size: {
    value: new THREE.Vector2(50, 50)
  },
  lineHalfWidth: {
    value: 1.0
  },
  enabled: {
    value: false
  }
}

//debugging purposes in jsfiddle
var selected_objects = [];
var highlighted_objects = [];


  </script>

CSS

body {
        overflow: hidden;
        margin: 0;
      }

JavaScript

/**
 * 
 * 
 * 
 */


  console.clear();
  setup();
  render();


var camera, scene, renderer, clock, player, terrainScene, decoScene, lastOptions, controls = {},
  fpsCamera, skyDome, skyLight, sand, water, stats, litCube, gui; // jscs:ignore requireLineBreakAfterVariableAssignment


//globals which are used by the utils lib
var active_camera;
var controlled_object;

var w_max = 500;
var h_max = 500;
var w_min = -500;
var h_min = -500;


function setup() {

  //
  setupThreeJS();
  setupMainCamera();
  setupControls();
  setupSkyDome();
  setupWorld();

}



function setupThreeJS() {

  scene = new THREE.Scene();
  //scene.fog = new THREE.FogExp2(0x868293, 0.0007);
  // set the name to make it easier to find in console.log
  scene.name = 'Scene';

  renderer = new THREE.WebGLRenderer({
    antialias: true,
    alpha: false
  })

  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);
  renderer.domElement.setAttribute('tabindex', -1);

  clock = new THREE.Clock(false);


    // Add stats to page.
    stats = new Stats();
    document.body.appendChild( stats.dom );

}

function setupMainCamera() {
  camera = new THREE.PerspectiveCamera(55, renderer.domElement.width / renderer.domElement.height, 1, 10000);
  scene.add(camera);
  camera.position.x = 600;
  camera.position.y = 361;
  camera.position.z = 606;
  camera.rotation.x = -62 * Math.PI / 180;
  camera.rotation.y = 35 * Math.PI / 180;
  camera.rotation.z = 42 * Math.PI / 180;

  //give the camera a name so it can be found in console.log
  camera.name = 'Main Cam';

  // make this the active camera
  active_camera = camera;
}

function setupControls() {

  //create a camera to track the active object
  fpsCamera = new THREE.PerspectiveCamera(60, renderer.domElement.width / renderer.domElement.height, 1, 10000);

  fpsCamera.name = 'FPS Cam';

  // create using Orbit example  
  controls = new THREE.OrbitControls(camera, renderer.domElement);
 ...