Change vertex color

by MichaelJendryke

HTML

<!DOCTYPE html>
<html>
<body>
<div class="slidecontainer">
  <input type="range" min="1" max="4" value="1" class="slider" id="myRange">
</div>

</body>
</html>

CSS

body {
  overflow: hidden;
  margin: 0;
}

.slidecontainer {
  width: 100%; /* Width of the outside container */
}

/* The slider itself */
.slider {
  -webkit-appearance: none;  /* Override default CSS styles */
  appearance: none;
  width: 100%; /* Full-width */
  height: 25px; /* Specified height */
  background: #d3d3d3; /* Grey background */
  outline: none; /* Remove outline */
  opacity: 0.7; /* Set transparency (for mouse-over effects on hover) */
  -webkit-transition: .2s; /* 0.2 seconds transition on hover */
  transition: opacity .2s;
}

/* Mouse-over effects */
.slider:hover {
  opacity: 1; /* Fully shown on mouse-over */
}

/* The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */
.slider::-webkit-slider-thumb {
  -webkit-appearance: none; /* Override default look */
  appearance: none;
  width: 25px; /* Set a specific slider handle width */
  height: 25px; /* Slider handle height */
  background: #4CAF50; /* Green background */
  cursor: pointer; /* Cursor on hover */
}

.slider::-moz-range-thumb {
  width: 25px; /* Set a specific slider handle width */
  height: 25px; /* Slider handle height */
  background: #4CAF50; /* Green background */
  cursor: pointer; /* Cursor on hover */
}

JavaScript

// https://threejsfundamentals.org/threejs/lessons/threejs-custom-buffergeometry.html

import * as _ from "https://threejs.org/build/three.module.js";
import {
  BufferGeometryUtils
} from "https://threejs.org/examples/jsm/utils/BufferGeometryUtils.js";


let scene = new _.Scene();
let camera = new _.PerspectiveCamera(60, innerWidth / innerHeight, 1, 100);
camera.position.set(5, -5, 20);

let renderer = new _.WebGLRenderer();
renderer.setClearColor(0x202020);
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);

let geoms = [];
let c = new _.Color();
let cells = [
  [1, '#ff0000', '#ff0000', '#ff0000','#ffffff'],
  [2, '#00ff00', '#ff00ff', '#ff0000','#ffffff'],
  [3, '#0000ff', '#ffff00', '#ff00ff','#ffffff'],
  [4, '#ffffff', '#ffff00', '#00ff00','#ffffff']
];




for (let i = 0; i < cells.length; i++) {
  let g = createHex(cells[i]);
  g.translate(-cells.length + i * cells.length, 0, 0);
  geoms.push(g);
}

let geom = BufferGeometryUtils.mergeBufferGeometries(geoms);
let mat = new _.MeshBasicMaterial({
  vertexColors: true,
  wireframe: true
});
let mesh = new _.Mesh(geom, mat);

scene.add(mesh);

function createHex(cell) {
  let baseVec = new _.Vector3(1, 0, 0);
  let axis = new _.Vector3(0, 0, 1);
  let angleStep = Math.PI / 3;
  let pts = [];
  let col = [
    [],
    [],
    [],
    []
  ];

  for (let i = 0; i < 6; i++) {
    pts.push(new _.Vector3().copy(baseVec).applyAxisAngle(axis, angleStep * i));
    for (let j = 0; j < 4; j++) {
      c.set(cell[j + 1]); //get the fist color entry in the array
      col[j].push(c.r, c.g, c.b);
    }

  }


  let geomHex = new _.BufferGeometry().setFromPoints(pts);
  geomHex.setIndex([0, 2, 4, 0, 1, 2, 2, 3, 4, 4, 5, 0]);
  geomHex.setAttribute("color", new _.BufferAttribute(new Float32Array(col[0]), 3));
  geomHex.setAttribute("color1", new _.BufferAttribute(new Float32Array(col[0]), 3));
  geomHex.setAttribute("color2", new _.BufferAttribute(new Float32Array(col[1]), 3));
 ...