mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 09:41:24 +01:00
3d preview to Heightmap editor (#329)
This commit is contained in:
parent
efd9159737
commit
0e308079aa
8 changed files with 51152 additions and 2 deletions
105
modules/ui/3dpreview.js
Normal file
105
modules/ui/3dpreview.js
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
// Define variables - these make it easy to work with from the console
|
||||
var _3dpreviewScale = 50;
|
||||
var _3dpreviewCamera = null;
|
||||
var _3dpreviewScene = null;
|
||||
var _3dpreviewRenderer = null;
|
||||
var _3danimationFrame = null;
|
||||
var _3dmaterial = null;
|
||||
var _3dtexture = null;
|
||||
var _3dmesh = null;
|
||||
|
||||
// Create a mesh from pixel data
|
||||
function addMesh(width, height, segmentsX, segmentsY) {
|
||||
_3dgeometry = new THREE.PlaneGeometry(width, height, segmentsX-1, segmentsY-1);
|
||||
|
||||
_3dmaterial = new THREE.MeshBasicMaterial({
|
||||
wireframe: false,
|
||||
});
|
||||
|
||||
_3dtexture = new THREE.TextureLoader().load( getPreviewTexture(width, height) );
|
||||
// _3dtexture.minFilter = THREE.LinearFilter;
|
||||
_3dmaterial.map = _3dtexture;
|
||||
|
||||
var terrain = getHeightmap();
|
||||
|
||||
var l = _3dgeometry.vertices.length;
|
||||
|
||||
for (var i = 0; i < l; i++) // For each vertex
|
||||
{
|
||||
var terrainValue = terrain[i] / 255;
|
||||
_3dgeometry.vertices[i].z = _3dgeometry.vertices[i].z + terrainValue * _3dpreviewScale;
|
||||
}
|
||||
|
||||
_3dmesh = new THREE.Mesh(_3dgeometry, _3dmaterial);
|
||||
_3dmesh.rotation.x = -Math.PI / 2;
|
||||
_3dpreviewScene.add(_3dmesh);
|
||||
}
|
||||
|
||||
// Function to render scene and camera
|
||||
function render() {
|
||||
_3danimationFrame = requestAnimationFrame(render);
|
||||
_3dpreviewRenderer.render(_3dpreviewScene, _3dpreviewCamera);
|
||||
}
|
||||
|
||||
function check3dCamera(canvas) {
|
||||
// workaround to fix camera problems
|
||||
var resetCamera = 0;
|
||||
if (!_3dpreviewCamera) {
|
||||
resetCamera = 1;
|
||||
} else if (isNaN(_3dpreviewCamera.position.x)) {
|
||||
_3dpreviewCamera = null;
|
||||
resetCamera = 1;
|
||||
}
|
||||
|
||||
if (resetCamera) {
|
||||
_3dpreviewCamera = new THREE.PerspectiveCamera(70, canvas.width / canvas.height, 0.1, 10000); //Field-of-View, Aspect Ratio, Near Render, Far Render
|
||||
_3dpreviewCamera.position.z = 800;
|
||||
_3dpreviewCamera.position.y = 1000;
|
||||
}
|
||||
}
|
||||
|
||||
function removeMesh() {
|
||||
_3dpreviewScene.remove(_3dmesh);
|
||||
_3dmesh.geometry.dispose();
|
||||
_3dmesh.material.dispose();
|
||||
_3dmesh = undefined;
|
||||
_3dgeometry = undefined;
|
||||
_3dmaterial = undefined;
|
||||
_3dtexture = undefined;
|
||||
}
|
||||
|
||||
function start3dpreview(canvas) {
|
||||
_3dpreviewScene = new THREE.Scene();
|
||||
|
||||
check3dCamera(canvas);
|
||||
|
||||
_3dpreviewRenderer = new THREE.WebGLRenderer({ canvas: canvas });
|
||||
_3dpreviewControls = new THREE.OrbitControls( _3dpreviewCamera, _3dpreviewRenderer.domElement );
|
||||
_3dpreviewRenderer.setSize(canvas.width, canvas.height);
|
||||
|
||||
addMesh(graphWidth, graphHeight, grid.cellsX, grid.cellsY);
|
||||
|
||||
document.body.appendChild(_3dpreviewRenderer.domElement);
|
||||
|
||||
_3danimationFrame = requestAnimationFrame(render);
|
||||
}
|
||||
|
||||
function stop3dpreview() {
|
||||
if (_3danimationFrame) {
|
||||
cancelAnimationFrame(_3danimationFrame);
|
||||
_3danimationFrame = null;
|
||||
}
|
||||
removeMesh();
|
||||
|
||||
_3dpreviewScene = null;
|
||||
_3dpreviewRenderer = null;
|
||||
_3dpreviewControls = null;
|
||||
}
|
||||
|
||||
function update3dpreview(canvas) {
|
||||
removeMesh();
|
||||
check3dCamera(canvas);
|
||||
|
||||
_3dpreviewRenderer.setSize(canvas.width, canvas.height);
|
||||
addMesh(graphWidth, graphHeight, grid.cellsX, grid.cellsY);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue