Pixel-Composer/scripts/__mesh/__mesh.gml

150 lines
3.6 KiB
Text
Raw Normal View History

2023-03-19 09:17:39 +01:00
function Mesh() constructor {
triangles = [];
center = [ 0, 0 ];
2025-02-05 05:18:39 +01:00
bbox = [ 0, 0, 1, 1 ];
2023-03-19 09:17:39 +01:00
2024-11-18 03:25:38 +01:00
static getRandomPoint = function(seed) {
2023-03-19 09:17:39 +01:00
random_set_seed(seed);
if(array_length(triangles) == 0) return [ 0, 0 ];
var tri = triangles[irandom(array_length(triangles) - 1)];
var p0 = tri[0];
var p1 = tri[1];
var p2 = tri[2];
var a1 = random1D(seed); seed++;
var a2 = random1D(seed); seed++;
var _x = (1 - sqrt(a1)) * p0.x + (sqrt(a1) * (1 - a2)) * p1.x + (sqrt(a1) * a2) * p2.x;
var _y = (1 - sqrt(a1)) * p0.y + (sqrt(a1) * (1 - a2)) * p1.y + (sqrt(a1) * a2) * p2.y;
return new __vec2( _x, _y );
2024-11-18 03:25:38 +01:00
}
2023-03-19 09:17:39 +01:00
2024-11-18 03:25:38 +01:00
static draw = function(_x, _y, _s) {
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
2023-03-19 09:17:39 +01:00
var t = triangles[i];
draw_line(_x + t[0].x * _s, _y + t[0].y * _s, _x + t[1].x * _s, _y + t[1].y * _s);
draw_line(_x + t[1].x * _s, _y + t[1].y * _s, _x + t[2].x * _s, _y + t[2].y * _s);
draw_line(_x + t[0].x * _s, _y + t[0].y * _s, _x + t[2].x * _s, _y + t[2].y * _s);
}
2024-11-18 03:25:38 +01:00
}
2023-03-19 09:17:39 +01:00
2024-11-18 03:25:38 +01:00
static pointIn = function(_x, _y) {
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
2023-03-19 09:17:39 +01:00
var t = triangles[i];
if(point_in_triangle(_x, _y, t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y))
return true;
}
return false;
2024-11-18 03:25:38 +01:00
}
2023-03-19 09:17:39 +01:00
2025-02-05 05:18:39 +01:00
static mergePath = function(_conn = true) {
2023-03-19 09:17:39 +01:00
if(array_length(triangles) == 0) return [];
var segments = [];
2025-02-05 05:18:39 +01:00
var pointsPairs = {};
2023-03-19 09:17:39 +01:00
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
2023-03-19 09:17:39 +01:00
var t = triangles[i];
for( var j = 0; j < 3; j++ ) {
var p0 = t[(j + 0) % 3];
var p1 = t[(j + 1) % 3];
var overlap = false;
var ind = -1;
var amo = array_length(segments);
for( var k = 0; k < amo; k ++ ) {
if( (segments[k][0].equal(p0) && segments[k][1].equal(p1)) ||
(segments[k][0].equal(p1) && segments[k][1].equal(p0)) ) {
overlap = true;
ind = k;
break;
}
}
if(overlap) array_delete(segments, ind, 1);
else array_push(segments, [ p0, p1 ]);
}
}
2025-02-05 05:18:39 +01:00
if(!_conn) return segments;
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(segments); i < n; i++ ) {
2025-02-05 05:18:39 +01:00
var _s = segments[i];
pointsPairs[$ _s[0]] = _s[1];
pointsPairs[$ _s[1]] = _s[0];
2023-03-19 09:17:39 +01:00
}
var path = [ segments[0][0], segments[0][1] ];
2025-02-05 05:18:39 +01:00
var indx = 1;
2023-03-19 09:17:39 +01:00
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(segments); i < n; i++ ) {
2025-02-05 05:18:39 +01:00
var last_point = path[indx];
var next_point = pointsPairs[$ last_point];
if(next_point == undefined) break;
2023-03-19 09:17:39 +01:00
2025-02-05 05:18:39 +01:00
struct_remove(pointsPairs, last_point);
2023-03-19 09:17:39 +01:00
array_push(path, next_point);
2025-02-05 05:18:39 +01:00
indx++;
2023-03-19 09:17:39 +01:00
}
return path;
2024-11-18 03:25:38 +01:00
}
2023-03-19 09:17:39 +01:00
2024-11-18 03:25:38 +01:00
static clone = function() {
2023-03-19 09:17:39 +01:00
var msh = new Mesh();
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
2023-03-19 09:17:39 +01:00
msh.triangles[i] = [
triangles[i][0].clone(),
triangles[i][1].clone(),
triangles[i][2].clone(),
];
}
msh.center = [ center[0], center[1] ];
2023-03-19 09:17:39 +01:00
return msh;
2024-11-18 03:25:38 +01:00
}
2024-11-18 03:25:38 +01:00
static calcCoM = function() {
2025-02-05 05:18:39 +01:00
var _ax = 0;
var _ay = 0;
var _p = 0;
var _minx = infinity;
var _miny = infinity;
var _maxx = -infinity;
var _maxy = -infinity;
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
var _tr = triangles[i];
for( var j = 0; j < 3; j++ ) {
_ax += _tr[j].x;
_ay += _tr[j].y;
2025-02-05 05:18:39 +01:00
_minx = min(_minx, _tr[j].x);
_miny = min(_miny, _tr[j].y);
_maxx = max(_maxx, _tr[j].x);
_maxy = max(_maxy, _tr[j].y);
_p++;
}
}
center = [ 0, 0 ];
if(_p == 0) return;
center = [ _ax / _p, _ay / _p ];
2025-02-05 05:18:39 +01:00
bbox = [ _minx, _miny, _maxx, _maxy ];
2024-11-18 03:25:38 +01:00
}
2023-03-19 09:17:39 +01:00
static serialize = function() { return ""; }
static deserialize = function(s) { return self; }
}