2023-09-08 19:47:48 +02:00
|
|
|
#region functions
|
|
|
|
global.HLSL_FUNCTIONS = ds_map_create();
|
|
|
|
global.HLSL_FUNCTIONS[? "abs"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "acos"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "asfloat"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "asin"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "asint"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "atan"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "atan2"] = ["y", "x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "ceil"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "clamp"] = ["x", "min", "max"];
|
|
|
|
global.HLSL_FUNCTIONS[? "clip"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "cos"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "cosh"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "cross"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "ddx"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "ddy"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "degrees"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "determinant"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "distance"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "dot"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "exp"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "exp2"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "faceforward"] = ["n", "i", "ng"];
|
|
|
|
global.HLSL_FUNCTIONS[? "floor"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "fma"] = ["a", "b", "c"];
|
|
|
|
global.HLSL_FUNCTIONS[? "fmod"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "frac"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "frexp"] = ["x", "exp"];
|
|
|
|
global.HLSL_FUNCTIONS[? "fwidth"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "isfinite"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "isinf"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "isnan"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "ldexp"] = ["x", "exp"];
|
|
|
|
global.HLSL_FUNCTIONS[? "length"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "lerp"] = ["x", "y", "s"];
|
|
|
|
global.HLSL_FUNCTIONS[? "lit"] = ["n_dot_l", "n_dot_h", "m"];
|
|
|
|
global.HLSL_FUNCTIONS[? "log"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "log10"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "log2"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "max"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "min"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "modf"] = ["x", "out ip"];
|
|
|
|
global.HLSL_FUNCTIONS[? "mul"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "noise"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "normalize"]= ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "pow"] = ["x", "y"];
|
|
|
|
global.HLSL_FUNCTIONS[? "radians"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "rcp"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "reflect"] = ["i", "n"];
|
|
|
|
global.HLSL_FUNCTIONS[? "refract"] = ["i", "n", "?"];
|
|
|
|
global.HLSL_FUNCTIONS[? "round"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "rsqrt"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "saturate"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "sign"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "sin"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "sincos"] = ["x", "out s", "out c"];
|
|
|
|
global.HLSL_FUNCTIONS[? "sinh"] = ["x"];
|
2023-09-15 20:12:02 +02:00
|
|
|
global.HLSL_FUNCTIONS[? "smoothstep"]= ["min", "max", "x"];
|
2023-09-08 19:47:48 +02:00
|
|
|
global.HLSL_FUNCTIONS[? "sqrt"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "step"] = ["y", "x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "tan"] = ["x"];
|
|
|
|
global.HLSL_FUNCTIONS[? "tanh"] = ["x"];
|
2023-09-15 20:12:02 +02:00
|
|
|
global.HLSL_FUNCTIONS[? "transpose"]= ["x"];
|
2023-09-08 19:47:48 +02:00
|
|
|
global.HLSL_FUNCTIONS[? "trunc"] = ["x"];
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
global.HLSL_VAR = [ "float", "int", "float2", "float3", "float4", "float3x3", "float4x4", "sampler" ];
|
|
|
|
|
|
|
|
function hlsl_document_parser(prompt, node = noone) {
|
|
|
|
var params = [];
|
|
|
|
var lines = string_split(prompt, "\n");
|
|
|
|
|
|
|
|
for( var i = node.input_fix_len, n = ds_list_size(node.inputs); i < n; i += node.data_length ) {
|
|
|
|
var _arg_name = node.inputs[| i + 0].getValue();
|
|
|
|
var _arg_type = node.inputs[| i + 1].getValue();
|
|
|
|
|
2023-09-16 11:04:50 +02:00
|
|
|
if(_arg_type == 7) {
|
|
|
|
array_push(params, [ _arg_name + "Object", "Texture2D" ]);
|
|
|
|
array_push(params, [ _arg_name, "SamplerState" ]);
|
|
|
|
} else array_push(params, [ _arg_name, array_safe_get(global.HLSL_VAR, _arg_type) ]);
|
2023-09-08 19:47:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for( var i = 0, n = array_length(lines); i < n; i++ ) {
|
|
|
|
var line = string_trim(lines[i]);
|
|
|
|
var _token = string_split(line, " ");
|
|
|
|
var _vari = false;
|
|
|
|
var _vart = "";
|
|
|
|
var _vars = "";
|
|
|
|
|
|
|
|
for( var j = 0, m = array_length(_token); j < m; j++ ) {
|
|
|
|
if(_vari)
|
|
|
|
_vars += _token[j];
|
|
|
|
|
|
|
|
if(array_exists(global.HLSL_VAR, _token[j])) {
|
|
|
|
_vart = _token[j];
|
|
|
|
_vari = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_vars = string_replace_all(_vars, ";", "");
|
|
|
|
_vars = string_replace_all(_vars, " ", "");
|
|
|
|
_vars = string_splice(_vars, ",");
|
|
|
|
|
|
|
|
var _varType = [];
|
|
|
|
|
|
|
|
for( var j = 0, m = array_length(_vars); j < m; j++ ) {
|
|
|
|
var _eq = string_splice(_vars[j], "=");
|
|
|
|
_varType[j] = [ _eq[0], _vart ];
|
|
|
|
}
|
|
|
|
|
|
|
|
params = array_append(params, _varType);
|
|
|
|
}
|
|
|
|
|
|
|
|
return params;
|
|
|
|
}
|
|
|
|
|
|
|
|
function hlsl_autocomplete_server(prompt, params = []) {
|
|
|
|
var res = [];
|
|
|
|
var pr_list = ds_priority_create();
|
|
|
|
|
|
|
|
//////////////////////////////////
|
|
|
|
ds_priority_clear(pr_list);
|
|
|
|
|
|
|
|
for( var i = 0, n = array_length(params); i < n; i++ ) {
|
|
|
|
var gl = params[i];
|
|
|
|
|
|
|
|
var match = string_partial_match(string_lower(gl[0]), string_lower(prompt));
|
|
|
|
if(match == -9999) continue;
|
|
|
|
|
|
|
|
ds_priority_add(pr_list, [[THEME.ac_constant, 2], gl[0], gl[1], gl[0]], match);
|
|
|
|
}
|
|
|
|
|
|
|
|
repeat(ds_priority_size(pr_list))
|
|
|
|
array_push(res, ds_priority_delete_max(pr_list));
|
|
|
|
|
|
|
|
//////////////////////////////////
|
|
|
|
ds_priority_clear(pr_list);
|
|
|
|
|
|
|
|
for( var i = 0, n = array_length(global.HLSL_VAR); i < n; i++ ) {
|
|
|
|
var gl = global.HLSL_VAR[i];
|
|
|
|
|
|
|
|
var match = string_partial_match(string_lower(gl), string_lower(prompt));
|
|
|
|
if(match == -9999) continue;
|
|
|
|
|
|
|
|
ds_priority_add(pr_list, [[THEME.ac_constant, 3], gl, "var type", gl], match);
|
|
|
|
}
|
|
|
|
|
|
|
|
repeat(ds_priority_size(pr_list))
|
|
|
|
array_push(res, ds_priority_delete_max(pr_list));
|
|
|
|
|
|
|
|
//////////////////////////////////
|
|
|
|
ds_priority_clear(pr_list);
|
|
|
|
|
|
|
|
var F = global.HLSL_FUNCTIONS;
|
|
|
|
var _keys = ds_map_keys_to_array(F);
|
|
|
|
|
|
|
|
for( var i = 0, n = array_length(_keys); i < n; i++ ) {
|
|
|
|
var _key = _keys[i];
|
|
|
|
var match = string_partial_match(string_lower(_key), string_lower(prompt));
|
|
|
|
if(match == -9999)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
ds_priority_add(pr_list, [[THEME.ac_function, 0], _key, "function", _key], match);
|
|
|
|
}
|
|
|
|
|
|
|
|
repeat(ds_priority_size(pr_list))
|
|
|
|
array_push(res, ds_priority_delete_max(pr_list));
|
|
|
|
|
|
|
|
ds_priority_destroy(pr_list);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
function hlsl_function_guide_server(prompt) {
|
|
|
|
if(!ds_map_exists(global.HLSL_FUNCTIONS, prompt)) return "";
|
|
|
|
|
|
|
|
var fn = global.HLSL_FUNCTIONS[? prompt];
|
|
|
|
var guide = prompt + "(";
|
|
|
|
for( var i = 0, n = array_length(fn); i < n; i++ )
|
|
|
|
guide += (i? ", " : "") + string(fn[i]);
|
|
|
|
guide += ")";
|
|
|
|
|
|
|
|
return guide;
|
|
|
|
}
|