mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2024-12-26 23:17:25 +01:00
117 lines
No EOL
3.7 KiB
Text
117 lines
No EOL
3.7 KiB
Text
function __3dTerrain() : __3dObject() constructor {
|
|
VB = [ noone ];
|
|
VF = global.VF_POS_NORM_TEX_COL;
|
|
render_type = pr_trianglelist;
|
|
|
|
self.subdivision = 4;
|
|
|
|
heights = array_create((subdivision + 1) * (subdivision + 1));
|
|
|
|
static initModel = function() {
|
|
var _hs = 1 / 2;
|
|
var _vt = array_create(3 * 2 * subdivision * subdivision);
|
|
var _in = 0;
|
|
|
|
var amo_ch = (subdivision + 1) * (subdivision + 1);
|
|
var hs = array_length(heights) == amo_ch;
|
|
|
|
for( var i = 0; i < subdivision; i++ )
|
|
for( var j = 0; j < subdivision; j++ ) {
|
|
var u0 = (i + 0) / subdivision;
|
|
var u1 = (i + 1) / subdivision;
|
|
var v0 = (j + 0) / subdivision;
|
|
var v1 = (j + 1) / subdivision;
|
|
|
|
var x0 = -0.5 + u0;
|
|
var x1 = -0.5 + u1;
|
|
var y0 = -0.5 + v0;
|
|
var y1 = -0.5 + v1;
|
|
|
|
var _i0 = j * (subdivision + 1) + i;
|
|
var _i1 = j * (subdivision + 1) + i + 1;
|
|
var _i2 = (j + 1) * (subdivision + 1) + i;
|
|
var _i3 = (j + 1) * (subdivision + 1) + i + 1;
|
|
|
|
var _h0 = hs? heights[_i0] : 0;
|
|
var _h1 = hs? heights[_i1] : 0;
|
|
var _h2 = hs? heights[_i2] : 0;
|
|
var _h3 = hs? heights[_i3] : 0;
|
|
|
|
var _n = new __vec3(x1 - x0, y0 - y0, _h1 - _h0)
|
|
.cross(new __vec3(x0 - x0, y1 - y0, _h2 - _h0))
|
|
.normalize();
|
|
|
|
_vt[_in + 0] = new __vertex(x0, y0, _h0).setNormal(_n.x, _n.y, _n.z).setUV(u0, v0);
|
|
_vt[_in + 1] = new __vertex(x1, y1, _h3).setNormal(_n.x, _n.y, _n.z).setUV(u1, v1);
|
|
_vt[_in + 2] = new __vertex(x1, y0, _h1).setNormal(_n.x, _n.y, _n.z).setUV(u1, v0);
|
|
|
|
_vt[_in + 3] = new __vertex(x0, y0, _h0).setNormal(_n.x, _n.y, _n.z).setUV(u0, v0);
|
|
_vt[_in + 4] = new __vertex(x0, y1, _h2).setNormal(_n.x, _n.y, _n.z).setUV(u0, v1);
|
|
_vt[_in + 5] = new __vertex(x1, y1, _h3).setNormal(_n.x, _n.y, _n.z).setUV(u1, v1);
|
|
|
|
_in += 6;
|
|
}
|
|
|
|
vertex = [ _vt ];
|
|
VB = build();
|
|
} initModel();
|
|
|
|
static updateHeight = function(_h) {
|
|
heights = _h;
|
|
var _in = 0;
|
|
var _vt = vertex[0];
|
|
|
|
if(VB[0]) vertex_delete_buffer(VB[0]);
|
|
VB[0] = vertex_create_buffer();
|
|
vertex_begin(VB[0], VF);
|
|
|
|
for( var i = 0; i < subdivision; i++ )
|
|
for( var j = 0; j < subdivision; j++ ) {
|
|
var u0 = (i + 0) / subdivision;
|
|
var u1 = (i + 1) / subdivision;
|
|
var v0 = (j + 0) / subdivision;
|
|
var v1 = (j + 1) / subdivision;
|
|
|
|
var x0 = -0.5 + u0;
|
|
var x1 = -0.5 + u1;
|
|
var y0 = -0.5 + v0;
|
|
var y1 = -0.5 + v1;
|
|
|
|
var _i0 = j * (subdivision + 1) + i;
|
|
var _i1 = j * (subdivision + 1) + i + 1;
|
|
var _i2 = (j + 1) * (subdivision + 1) + i;
|
|
var _i3 = (j + 1) * (subdivision + 1) + i + 1;
|
|
|
|
var _h0 = heights[_i0];
|
|
var _h1 = heights[_i1];
|
|
var _h2 = heights[_i2];
|
|
var _h3 = heights[_i3];
|
|
|
|
var _n = new __vec3(x1 - x0, y0 - y0, _h1 - _h0)
|
|
.cross(new __vec3(x0 - x0, y1 - y0, _h2 - _h0))
|
|
.normalize();
|
|
|
|
_vt[_in + 0].z = _h0; _vt[_in + 0].nx = _n.x; _vt[_in + 0].ny = _n.y; _vt[_in + 0].nz = _n.z;
|
|
_vt[_in + 1].z = _h3; _vt[_in + 1].nx = _n.x; _vt[_in + 1].ny = _n.y; _vt[_in + 1].nz = _n.z;
|
|
_vt[_in + 2].z = _h1; _vt[_in + 2].nx = _n.x; _vt[_in + 2].ny = _n.y; _vt[_in + 2].nz = _n.z;
|
|
|
|
_vt[_in + 3].z = _h0; _vt[_in + 3].nx = _n.x; _vt[_in + 3].ny = _n.y; _vt[_in + 3].nz = _n.z;
|
|
_vt[_in + 4].z = _h2; _vt[_in + 4].nx = _n.x; _vt[_in + 4].ny = _n.y; _vt[_in + 4].nz = _n.z;
|
|
_vt[_in + 5].z = _h3; _vt[_in + 5].nx = _n.x; _vt[_in + 5].ny = _n.y; _vt[_in + 5].nz = _n.z;
|
|
|
|
vertex_add_vntc(VB[0], _vt[_in + 0]);
|
|
vertex_add_vntc(VB[0], _vt[_in + 1]);
|
|
vertex_add_vntc(VB[0], _vt[_in + 2]);
|
|
|
|
vertex_add_vntc(VB[0], _vt[_in + 3]);
|
|
vertex_add_vntc(VB[0], _vt[_in + 4]);
|
|
vertex_add_vntc(VB[0], _vt[_in + 5]);
|
|
|
|
_in += 6;
|
|
}
|
|
|
|
vertex_end(VB[0]);
|
|
}
|
|
|
|
onParameterUpdate = initModel;
|
|
} |