Skip to content
Snippets Groups Projects
Commit 4ef17f51 authored by Neil Gershenfeld's avatar Neil Gershenfeld
Browse files

1st height map, some errors

parent 6e4bd784
Branches
No related tags found
No related merge requests found
...@@ -29,7 +29,6 @@ var init = function() { ...@@ -29,7 +29,6 @@ var init = function() {
mod.inunits.value = 1 mod.inunits.value = 1
mod.width.value = 1000 mod.width.value = 1000
mod.border.value = 0 mod.border.value = 0
mod.delta = 1e-6
} }
// //
// inputs // inputs
...@@ -226,13 +225,12 @@ function find_limits_map() { ...@@ -226,13 +225,12 @@ function find_limits_map() {
var border = parseFloat(mod.border.value) var border = parseFloat(mod.border.value)
webworker.postMessage({ webworker.postMessage({
mesh:mod.mesh, mesh:mod.mesh,
border:border,delta:mod.delta}) border:border})
} }
function limits_worker() { function limits_worker() {
self.addEventListener('message',function(evt) { self.addEventListener('message',function(evt) {
var view = evt.data.mesh var view = evt.data.mesh
var border = evt.data.border var border = evt.data.border
var delta = evt.data.delta // perturb to remove degeneracies
// //
// get vars // get vars
// //
...@@ -252,23 +250,23 @@ function limits_worker() { ...@@ -252,23 +250,23 @@ function limits_worker() {
var zmax = -Number.MAX_VALUE var zmax = -Number.MAX_VALUE
for (var t = 0; t < triangles; ++t) { for (var t = 0; t < triangles; ++t) {
offset += 3*4 offset += 3*4
x0 = view.getFloat32(offset,endian)+delta x0 = view.getFloat32(offset,endian)
offset += 4 offset += 4
y0 = view.getFloat32(offset,endian)+delta y0 = view.getFloat32(offset,endian)
offset += 4 offset += 4
z0 = view.getFloat32(offset,endian)+delta z0 = view.getFloat32(offset,endian)
offset += 4 offset += 4
x1 = view.getFloat32(offset,endian)+delta x1 = view.getFloat32(offset,endian)
offset += 4 offset += 4
y1 = view.getFloat32(offset,endian)+delta y1 = view.getFloat32(offset,endian)
offset += 4 offset += 4
z1 = view.getFloat32(offset,endian)+delta z1 = view.getFloat32(offset,endian)
offset += 4 offset += 4
x2 = view.getFloat32(offset,endian)+delta x2 = view.getFloat32(offset,endian)
offset += 4 offset += 4
y2 = view.getFloat32(offset,endian)+delta y2 = view.getFloat32(offset,endian)
offset += 4 offset += 4
z2 = view.getFloat32(offset,endian)+delta z2 = view.getFloat32(offset,endian)
offset += 4 offset += 4
offset += 2 offset += 2
if (x0 > xmax) xmax = x0 if (x0 > xmax) xmax = x0
...@@ -314,7 +312,7 @@ function map_mesh() { ...@@ -314,7 +312,7 @@ function map_mesh() {
window.URL.revokeObjectURL(url) window.URL.revokeObjectURL(url)
var h = mod.img.height var h = mod.img.height
var w = mod.img.width var w = mod.img.width
var buf = new Uint8ClampedArray(evt.data.buffer) var buf = new Uint8ClampedArray(evt.data.imgbuffer)
var imgdata = new ImageData(buf,w,h) var imgdata = new ImageData(buf,w,h)
var ctx = mod.img.getContext("2d") var ctx = mod.img.getContext("2d")
ctx.putImageData(imgdata,0,0) ctx.putImageData(imgdata,0,0)
...@@ -342,13 +340,14 @@ function map_mesh() { ...@@ -342,13 +340,14 @@ function map_mesh() {
mod.img.height = Math.round(mod.img.width*mod.dy/mod.dx) mod.img.height = Math.round(mod.img.width*mod.dy/mod.dx)
var ctx = mod.img.getContext("2d") var ctx = mod.img.getContext("2d")
var img = ctx.getImageData(0,0,mod.img.width,mod.img.height) var img = ctx.getImageData(0,0,mod.img.width,mod.img.height)
var map = new Float32Array(1000)
webworker.postMessage({ webworker.postMessage({
height:mod.img.height,width:mod.img.width, height:mod.img.height,width:mod.img.width,
imgbuffer:img.data.buffer,mesh:mod.mesh, imgbuffer:img.data.buffer,
mesh:mod.mesh,
xmin:mod.xmin,xmax:mod.xmax, xmin:mod.xmin,xmax:mod.xmax,
ymin:mod.ymin,ymax:mod.ymax, ymin:mod.ymin,ymax:mod.ymax,
zmin:mod.zmin,zmax:mod.zmax, zmin:mod.zmin,zmax:mod.zmax},
delta:mod.delta},
[img.data.buffer]) [img.data.buffer])
} }
function map_worker() { function map_worker() {
...@@ -356,7 +355,6 @@ function map_worker() { ...@@ -356,7 +355,6 @@ function map_worker() {
var h = evt.data.height var h = evt.data.height
var w = evt.data.width var w = evt.data.width
var view = evt.data.mesh var view = evt.data.mesh
var delta = evt.data.delta // perturb to remove degeneracies
var xmin = evt.data.xmin var xmin = evt.data.xmin
var xmax = evt.data.xmax var xmax = evt.data.xmax
var ymin = evt.data.ymin var ymin = evt.data.ymin
...@@ -364,6 +362,7 @@ function map_worker() { ...@@ -364,6 +362,7 @@ function map_worker() {
var zmin = evt.data.zmin var zmin = evt.data.zmin
var zmax = evt.data.zmax var zmax = evt.data.zmax
var buf = new Uint8ClampedArray(evt.data.imgbuffer) var buf = new Uint8ClampedArray(evt.data.imgbuffer)
var map = new Float32Array(h*w)
// //
// get vars from buffer // get vars from buffer
// //
...@@ -371,16 +370,157 @@ function map_worker() { ...@@ -371,16 +370,157 @@ function map_worker() {
var triangles = view.getUint32(80,endian) var triangles = view.getUint32(80,endian)
var size = 80+4+triangles*(4*12+2) var size = 80+4+triangles*(4*12+2)
// //
// initialize map image // initialize map and image
// //
for (var row = 0; row < h; ++row) { for (var row = 0; row < h; ++row) {
for (var col = 0; col < w; ++col) { for (var col = 0; col < w; ++col) {
buf[(h-1-row)*w*4+col*4+0] = row map[(h-1-row)*w+col] = 0
buf[(h-1-row)*w*4+col*4+1] = col buf[(h-1-row)*w*4+col*4+0] = 0
buf[(h-1-row)*w*4+col*4+1] = 0
buf[(h-1-row)*w*4+col*4+2] = 0 buf[(h-1-row)*w*4+col*4+2] = 0
buf[(h-1-row)*w*4+col*4+3] = 255 buf[(h-1-row)*w*4+col*4+3] = 255
} }
} }
//
// loop over triangles
//
var segs = []
offset = 80+4
for (var t = 0; t < triangles; ++t) {
offset += 3*4
x0 = view.getFloat32(offset,endian)
offset += 4
y0 = view.getFloat32(offset,endian)
offset += 4
z0 = view.getFloat32(offset,endian)
offset += 4
x1 = view.getFloat32(offset,endian)
offset += 4
y1 = view.getFloat32(offset,endian)
offset += 4
z1 = view.getFloat32(offset,endian)
offset += 4
x2 = view.getFloat32(offset,endian)
offset += 4
y2 = view.getFloat32(offset,endian)
offset += 4
z2 = view.getFloat32(offset,endian)
offset += 4
offset += 2
//
// quantize image coordinates
//
x0 = Math.floor((w-1)*(x0-xmin)/(xmax-xmin))
x1 = Math.floor((w-1)*(x1-xmin)/(xmax-xmin))
x2 = Math.floor((w-1)*(x2-xmin)/(xmax-xmin))
y0 = Math.floor((h-1)*(y0-ymin)/(ymax-ymin))
y1 = Math.floor((h-1)*(y1-ymin)/(ymax-ymin))
y2 = Math.floor((h-1)*(y2-ymin)/(ymax-ymin))
//
// check normal if needs to be drawn
//
if (((x1-x0)*(y1-y2)-(x1-x2)*(y1-y0)) >= 0)
continue
//
// sort projection order
//
if (y1 > y2) {
var temp = x1;
x1 = x2;
x2 = temp
var temp = y1;
y1 = y2;
y2 = temp
var temp = z1;
z1 = z2;
z2 = temp
}
if (y0 > y1) {
var temp = x0;
x0 = x1;
x1 = temp
var temp = y0;
y0 = y1;
y1 = temp
var temp = z0;
z0 = z1;
z1 = temp
}
if (y1 > y2) {
var temp = x1;
x1 = x2;
x2 = temp
var temp = y1;
y1 = y2;
y2 = temp
var temp = z1;
z1 = z2;
z2 = temp
}
//
// check orientation after sort
//
if (x1 < (x0+((x2-x0)*(y1-y0))/(y2-y0)))
var dir = 1;
else
var dir = -1;
//
// set z values
//
if (y2 != y1) {
for (var y = y1; y <= y2; ++y) {
if (y < 0) continue
if (y > (h - 1)) break
x12 = Math.floor(0.5+x1+(y-y1)*(x2-x1)/(y2-y1))
z12 = z1+(y-y1)*(z2-z1)/(y2-y1)
x02 = Math.floor(0.5+x0+(y-y0)*(x2-x0)/(y2-y0))
z02 = z0+(y-y0)*(z2-z0)/(y2-y0)
if (x12 != x02)
var slope = (z02-z12)/(x02-x12)
else
var slope = 0
var x = x12 - dir
while (x != x02) {
x += dir
if ((x < 0) || (x > (h-1))) continue
var z = z12+slope*(x-x12)
var iz = Math.floor(255*(z-zmin)/(zmax-zmin))
buf[(h-1-y)*w*4+x*4+0] = iz
buf[(h-1-y)*w*4+x*4+1] = iz
buf[(h-1-y)*w*4+x*4+2] = iz
//if (z > view.getFloat32((h-1-y)*4*w+x*4))
// view.setFloat32((h-1-y)*4*w+x*4,z)
}
}
}
if (y1 != y0) {
for (var y = y0; y <= y1; ++y) {
if (y < 0) continue
if (y > (h-1)) break
x01 = Math.floor(0.5+x0+(y-y0)*(x1-x0)/(y1-y0))
z01 = z0+(y-y0)*(z1-z0)/(y1-y0)
x02 = Math.floor(0.5+x0+(y-y0)*(x2-x0)/(y2-y0))
z02 = z0+(y-y0)*(z2-z0)/(y2-y0)
if (x01 != x02)
var slope = (z02-z01)/(x02-x01)
else
var slope = 0
var x = x01 - dir
while (x != x02) {
x += dir
if ((x < 0) || (x > (w-1))) continue
var z = z01+slope*(x-x01)
var iz = Math.floor(255*(z-zmin)/(zmax-zmin))
buf[(h-1-y)*w*4+x*4+0] = iz
buf[(h-1-y)*w*4+x*4+1] = iz
buf[(h-1-y)*w*4+x*4+2] = iz
//if (z > view.getFloat32((h-1-y)*4*w+x*4))
//if (z > view.getFloat32((h-1-y)*4*w+x*4))
// view.setFloat32((h-1-y)*4*w+x*4,z)
}
}
}
}
/* /*
// //
// find triangles crossing the map // find triangles crossing the map
...@@ -389,23 +529,23 @@ function map_worker() { ...@@ -389,23 +529,23 @@ function map_worker() {
offset = 80+4 offset = 80+4
for (var t = 0; t < triangles; ++t) { for (var t = 0; t < triangles; ++t) {
offset += 3*4 offset += 3*4
x0 = view.getFloat32(offset,endian)+delta x0 = view.getFloat32(offset,endian)
offset += 4 offset += 4
y0 = view.getFloat32(offset,endian)+delta y0 = view.getFloat32(offset,endian)
offset += 4 offset += 4
z0 = view.getFloat32(offset,endian)+delta z0 = view.getFloat32(offset,endian)
offset += 4 offset += 4
x1 = view.getFloat32(offset,endian)+delta x1 = view.getFloat32(offset,endian)
offset += 4 offset += 4
y1 = view.getFloat32(offset,endian)+delta y1 = view.getFloat32(offset,endian)
offset += 4 offset += 4
z1 = view.getFloat32(offset,endian)+delta z1 = view.getFloat32(offset,endian)
offset += 4 offset += 4
x2 = view.getFloat32(offset,endian)+delta x2 = view.getFloat32(offset,endian)
offset += 4 offset += 4
y2 = view.getFloat32(offset,endian)+delta y2 = view.getFloat32(offset,endian)
offset += 4 offset += 4
z2 = view.getFloat32(offset,endian)+delta z2 = view.getFloat32(offset,endian)
offset += 4 offset += 4
// //
// assemble vertices // assemble vertices
...@@ -482,7 +622,7 @@ function map_worker() { ...@@ -482,7 +622,7 @@ function map_worker() {
// //
// output the map // output the map
// //
self.postMessage({buffer:buf.buffer},[buf.buffer]) self.postMessage({imgbuffer:buf.buffer},[buf.buffer])
self.close() self.close()
}) })
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment