[Plot Path] Add 3d parametric.

This commit is contained in:
Tanasart 2025-01-29 08:22:38 +07:00
parent af2c8a94c4
commit a386dfc771
3 changed files with 100 additions and 72 deletions

Binary file not shown.

View file

@ -277,6 +277,7 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
var _ox, _nx, _nx1, _oy, _ny, _ny1;
var _ow, _nw, _oa, _na, _oc, _nc, _owg, _nwg;
var _wmin = 0, _wmax = 1;
switch(_dtype) {
case 0 :
@ -344,6 +345,8 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
lines = array_verify(lines, lineLen);
var _lineAmo = 0;
var _wmin = infinity;
var _wmax = -infinity;
if(_rtMax > 0)
for( var i = 0; i < lineLen; i++ ) {
@ -430,6 +433,9 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
_nx = p.x;
_ny = p.y;
_wmin = min(_wmin, wght);
_wmax = max(_wmax, wght);
if(_total < _pathEnd) { //Do not wiggle the last point.
var _d = point_direction(_ox, _oy, _nx, _ny);
_nx += lengthdir_x(random1D(_sed + _sedIndex, -_wig, _wig), _d + 90); _sedIndex++;
@ -482,6 +488,8 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
array_resize(lines, _lineAmo);
array_resize(line_data, _lineAmo);
if(_wmax == _wmin) { _wmin = 0; _wmax = 1; }
if(_pbbox) _surfDim = [ max(1, maxx - minx + _ppadd[0] + _ppadd[2]), max(1, maxy - miny + _ppadd[1] + _ppadd[3]) ];
break;
@ -618,11 +626,12 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
widthMap[? widProg] = eval_curve_x(_widc, widProg, 0.1);
_nw *= widthMap[? widProg];
if(_wg2wid) _nw *= p0.weight / 2;
var _ww = lerp_invert(p0.weight, _wmin, _wmax);
if(_wg2wid) _nw *= _ww / 2;
_nc = _col_base;
_nc = colorMultiply(_nc, _color.eval(_colP? prog : prgc));
_nc = colorMultiply(_nc, _wg2clr.eval((p0.weight - _wg2clrR[0]) / _wg2clrRng));
_nc = colorMultiply(_nc, _wg2clr.eval((_ww - _wg2clrR[0]) / _wg2clrRng));
if(_cap) {
if(j == 1) {
@ -747,12 +756,13 @@ function Node_Line(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) cons
var _dir = j? point_direction(_ox, _oy, _nx, _ny) : 0;
var widProg = value_snap_real(_widap? prog : prgc, 0.01);
var _ww = lerp_invert(p0.weight, _wmin, _wmax);
_nw = random_range(_wid[0], _wid[1]);
if(!ds_map_exists(widthMap, widProg))
widthMap[? widProg] = eval_curve_x(_widc, widProg, 0.1);
_nw *= widthMap[? widProg];
_nw *= p0.weight;
_nw *= _ww;
if(_cap) {
if(j == 1) {

View file

@ -27,12 +27,17 @@ function Node_Path_Plot(_x, _y, _group = noone) : Node(_x, _y, _group) construct
newInput(10, nodeValue_Text("w(x)", self, ""));
newInput(11, nodeValue_Text("z(x)", self, ""));
newInput(12, nodeValue_Bool("3D", self, false));
newOutput(0, nodeValue_Output("Path", self, VALUE_TYPE.pathnode, self));
input_display_list = [
[ "Variable", false], 5, 7, 8, 0,
[ "Equation", false], 1, 2, 3, 4, 6,
[ "Weight", false, 9], 10,
[ "Variable", false], 5, 7, 8, 0,
[ "Equation", false], 1, 2, 3, 4, 6,
[ "Weight", false, 9], 10,
[ "3D", false, 12], 11,
]
boundary = new BoundingBox( 0, 0, 1, 1 );
@ -41,18 +46,18 @@ function Node_Path_Plot(_x, _y, _group = noone) : Node(_x, _y, _group) construct
curr_sca = 0;
curr_coor = 0;
curr_eqa = 0;
curr_eq0 = 0;
curr_eq1 = 0;
curr_orig = 0;
curr_ran = 0;
curr_iran = 0;
curr_shf = 0;
curr_d3d = 0;
curr_usew = 0;
curr_wgfn = 0;
fn0 = 0;
fn1 = 0;
fn2 = 0;
_a = new __vec2P();
_param = { x:0, y:0, t:0, r:0, O:0 };
@ -68,7 +73,8 @@ function Node_Path_Plot(_x, _y, _group = noone) : Node(_x, _y, _group) construct
static getBoundary = function() /*=>*/ {return boundary};
static getPointRatio = function(_rat, ind = 0, out = undefined) {
if(out == undefined) out = new __vec2P(); else { out.x = 0; out.y = 0; }
if(out == undefined) out = curr_d3d? new __vec3P() : new __vec2P();
else { out.x = 0; out.y = 0; out.z = 0; }
_rat = curr_ran[0] + (_rat * (curr_ran[1] - curr_ran[0]));
@ -106,6 +112,11 @@ function Node_Path_Plot(_x, _y, _group = noone) : Node(_x, _y, _group) construct
_param.t = _rat * curr_iran[1] + curr_shf[1];
out.y = fn1.eval(_param);
if(curr_d3d) {
_param.t = _rat;
out.z = fn2.eval(_param);
}
if(curr_usew) {
_param.t = _rat;
out.weight = fnw.eval(_param);
@ -149,6 +160,11 @@ function Node_Path_Plot(_x, _y, _group = noone) : Node(_x, _y, _group) construct
_param.t = _rat * curr_iran[1] + curr_shf[1];
_ay = fn1.eval(_param);
if(curr_d3d) {
_param.t = _rat;
out.z = fn2.eval(_param);
}
if(curr_usew) {
_param.t = _rat;
out.weight = fnw.eval(_param);
@ -169,62 +185,6 @@ function Node_Path_Plot(_x, _y, _group = noone) : Node(_x, _y, _group) construct
static getPointDistance = function(_dist, ind = 0, out = undefined) { return getPointRatio(_dist / getLength(ind), ind, out); }
static step = function() {
var _coor = getInputData(1);
var _eqa = getInputData(2);
inputs[2].editWidget.data_list = _coor? eq_type_pol : eq_type_car;
inputs[4].setVisible(_eqa == 2);
switch(_coor) {
case 0 :
switch(_eqa) {
case 0 :
inputs[ 3].name = "f(x) = ";
inputs[ 6].name = "x range";
inputs[10].name = "w(x) = ";
break;
case 1 :
inputs[ 3].name = "f(y) = ";
inputs[ 6].name = "y range";
inputs[10].name = "w(y) = ";
break;
case 2 :
inputs[ 3].name = "x(t) = ";
inputs[ 4].name = "y(t) = ";
inputs[ 6].name = "t range";
inputs[10].name = "w(t) = ";
break;
}
break;
case 1 :
switch(_eqa) {
case 0 :
inputs[ 3].name = "f(r) = ";
inputs[ 6].name = "r range";
inputs[10].name = "w(r) = ";
break;
case 1 :
inputs[ 3].name = "f(O) = ";
inputs[ 6].name = "O range";
inputs[10].name = "w(O) = ";
break;
case 2 :
inputs[ 3].name = "r(t) = ";
inputs[ 4].name = "O(t) = ";
inputs[ 6].name = "t range";
inputs[10].name = "w(t) = ";
break;
}
break;
}
}
static updateBoundary = function() {
boundary = new BoundingBox( 0, 0, 1, 1 );
length = 0;
@ -246,22 +206,80 @@ function Node_Path_Plot(_x, _y, _group = noone) : Node(_x, _y, _group) construct
curr_sca = getInputData(0);
curr_coor = getInputData(1);
curr_eqa = getInputData(2);
curr_eq0 = getInputData(3);
curr_eq1 = getInputData(4);
curr_orig = getInputData(5);
curr_ran = getInputData(6);
curr_iran = getInputData(7);
curr_shf = getInputData(8);
curr_usew = getInputData( 9);
curr_usew = getInputData(9);
curr_wgfn = getInputData(10);
curr_d3d = getInputData(12);
fn0 = evaluateFunctionList(curr_eq0);
fn1 = evaluateFunctionList(curr_eq1);
var _eq0 = getInputData(3);
var _eq1 = getInputData(4);
var _eq2 = getInputData(11);
fn0 = evaluateFunctionList(_eq0);
fn1 = evaluateFunctionList(_eq1);
fn2 = evaluateFunctionList(_eq2);
fnw = evaluateFunctionList(curr_wgfn);
_a = curr_d3d? new __vec3P() : new __vec2P();
updateBoundary();
outputs[0].setValue(self);
outputs[0].setValue(self);
#region display
inputs[ 2].editWidget.data_list = curr_coor? eq_type_pol : eq_type_car;
inputs[ 4].setVisible(curr_eqa == 2);
switch(curr_coor) {
case 0 :
switch(curr_eqa) {
case 0 :
inputs[ 3].name = "f(x) = ";
inputs[ 6].name = "x range";
inputs[10].name = "w(x) = ";
break;
case 1 :
inputs[ 3].name = "f(y) = ";
inputs[ 6].name = "y range";
inputs[10].name = "w(y) = ";
break;
case 2 :
inputs[ 3].name = "x(t) = ";
inputs[ 4].name = "y(t) = ";
inputs[ 6].name = "t range";
inputs[10].name = "w(t) = ";
break;
}
break;
case 1 :
switch(_eqa) {
case 0 :
inputs[ 3].name = "f(r) = ";
inputs[ 6].name = "r range";
inputs[10].name = "w(r) = ";
break;
case 1 :
inputs[ 3].name = "f(O) = ";
inputs[ 6].name = "O range";
inputs[10].name = "w(O) = ";
break;
case 2 :
inputs[ 3].name = "r(t) = ";
inputs[ 4].name = "O(t) = ";
inputs[ 6].name = "t range";
inputs[10].name = "w(t) = ";
break;
}
break;
}
#endregion
}
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {