heightmap data
parent
af3586db85
commit
1528637994
102
game-lib.js
102
game-lib.js
|
@ -3247,6 +3247,108 @@ GameLib.D3.Game.prototype.LinkPair = function (
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* * * * * * * * * *
|
||||||
|
* Heightmap Tools
|
||||||
|
* * * * * * * * * */
|
||||||
|
|
||||||
|
GameLib.D3.HeightmapData = function (
|
||||||
|
sizeX,
|
||||||
|
sizeY,
|
||||||
|
matrix
|
||||||
|
) {
|
||||||
|
this.sizeX = sizeX || 0;
|
||||||
|
this.sizeY = sizeY || 0;
|
||||||
|
|
||||||
|
// 2D Array with height data
|
||||||
|
// Column-major
|
||||||
|
this.matrix = matrix || [];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Note: this currently only works for cannon!
|
||||||
|
GameLib.D3.GenerateThreeMeshFromHeightField = function (
|
||||||
|
heightFieldShape
|
||||||
|
// Physics type.....
|
||||||
|
) {
|
||||||
|
|
||||||
|
var geometry = new THREE.Geometry();
|
||||||
|
|
||||||
|
var v0 = new CANNON.Vec3();
|
||||||
|
var v1 = new CANNON.Vec3();
|
||||||
|
var v2 = new CANNON.Vec3();
|
||||||
|
|
||||||
|
var shape = heightFieldShape;
|
||||||
|
for (var xi = 0; xi < shape.data.length - 1; xi++) {
|
||||||
|
for (var yi = 0; yi < shape.data[xi].length - 1; yi++) {
|
||||||
|
for (var k = 0; k < 2; k++) {
|
||||||
|
shape.getConvexTrianglePillar(xi, yi, k===0);
|
||||||
|
v0.copy(shape.pillarConvex.vertices[0]);
|
||||||
|
v1.copy(shape.pillarConvex.vertices[1]);
|
||||||
|
v2.copy(shape.pillarConvex.vertices[2]);
|
||||||
|
v0.vadd(shape.pillarOffset, v0);
|
||||||
|
v1.vadd(shape.pillarOffset, v1);
|
||||||
|
v2.vadd(shape.pillarOffset, v2);
|
||||||
|
geometry.vertices.push(
|
||||||
|
new THREE.Vector3(v0.x, v0.y, v0.z),
|
||||||
|
new THREE.Vector3(v1.x, v1.y, v1.z),
|
||||||
|
new THREE.Vector3(v2.x, v2.y, v2.z)
|
||||||
|
);
|
||||||
|
var i = geometry.vertices.length - 3;
|
||||||
|
geometry.faces.push(new THREE.Face3(i, i+1, i+2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
geometry.computeBoundingSphere();
|
||||||
|
geometry.computeFaceNormals();
|
||||||
|
|
||||||
|
return new THREE.Mesh(geometry, new THREE.MeshNormalMaterial({ wireframe : false, shading : THREE.SmoothShading }));
|
||||||
|
};
|
||||||
|
|
||||||
|
GameLib.D3.GenerateHeightmapDataFromImage = function (
|
||||||
|
imagePath,
|
||||||
|
callback // receives HeightmapData instance as the first argument
|
||||||
|
) {
|
||||||
|
var img = new Image();
|
||||||
|
|
||||||
|
img.onload = function () {
|
||||||
|
|
||||||
|
var canvas = document.createElement('canvas');
|
||||||
|
canvas.width = img.width;
|
||||||
|
canvas.height = img.height;
|
||||||
|
|
||||||
|
var context = canvas.getContext('2d');
|
||||||
|
context.drawImage(img, 0, 0);
|
||||||
|
|
||||||
|
var imgd = context.getImageData(0, 0, img.width, img.height);
|
||||||
|
var pixels = imgd.data;
|
||||||
|
|
||||||
|
var heightList = [];
|
||||||
|
for (var i = 0, n = pixels.length; i < n; i += (4)) {
|
||||||
|
heightList.push(pixels[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var matrix = [];
|
||||||
|
var sizeX = img.width,
|
||||||
|
sizeY = img.height;
|
||||||
|
|
||||||
|
for (var i = 0; i < sizeX; i++) {
|
||||||
|
matrix.push([]);
|
||||||
|
for (var j = 0; j < sizeY; j++) {
|
||||||
|
var height = (heightList[(sizeX - i) + j * sizeY] / 255) * 15;
|
||||||
|
matrix[i].push(height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// todo: delete canvas here
|
||||||
|
|
||||||
|
callback(new GameLib.D3.HeightmapData(sizeX, sizeY, matrix));
|
||||||
|
};
|
||||||
|
|
||||||
|
img.src = imagePath;
|
||||||
|
};
|
||||||
|
|
||||||
if (typeof module != 'undefined') {
|
if (typeof module != 'undefined') {
|
||||||
module.exports = GameLib.D3;
|
module.exports = GameLib.D3;
|
||||||
}
|
}
|
Loading…
Reference in New Issue