2023-09-08 14:51:05 +02:00
|
|
|
#region vb
|
|
|
|
vertex_format_begin();
|
|
|
|
vertex_format_add_position();
|
|
|
|
vertex_format_add_color();
|
|
|
|
vertex_format_add_texcoord();
|
|
|
|
global.HLSL_VB_FORMAT = vertex_format_end();
|
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
global.HLSL_VB_PLANE = vertex_create_buffer();
|
|
|
|
vertex_begin(global.HLSL_VB_PLANE, global.HLSL_VB_FORMAT);
|
|
|
|
|
2024-09-24 11:51:04 +02:00
|
|
|
vertex_add_2pct(global.HLSL_VB_PLANE, 0, 0, 0, 0, c_white);
|
|
|
|
vertex_add_2pct(global.HLSL_VB_PLANE, 0, 1, 0, 1, c_white);
|
|
|
|
vertex_add_2pct(global.HLSL_VB_PLANE, 1, 0, 1, 0, c_white);
|
|
|
|
vertex_add_2pct(global.HLSL_VB_PLANE, 1, 1, 1, 1, c_white);
|
2024-03-02 10:08:44 +01:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
vertex_end(global.HLSL_VB_PLANE);
|
2023-09-08 14:51:05 +02:00
|
|
|
#endregion
|
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
#region libraries
|
|
|
|
globalvar HLSL_LIBRARIES, HLSL_LIBRARIES_ARR;
|
|
|
|
|
|
|
|
function __initHLSL() {
|
|
|
|
HLSL_LIBRARIES = {};
|
|
|
|
HLSL_LIBRARIES_ARR = [];
|
|
|
|
|
|
|
|
var _dir = $"{DIRECTORY}Nodes/HLSL";
|
|
|
|
directory_verify(_dir);
|
|
|
|
var _files = readFolder(_dir);
|
|
|
|
|
|
|
|
for( var i = 0, n = array_length(_files); i < n; i++ ) {
|
|
|
|
var _f = _files[i];
|
|
|
|
var _n = string_replace(_f, _dir + "/", "");
|
|
|
|
_n = string_replace(_n, filename_ext(_n), "");
|
|
|
|
|
|
|
|
HLSL_LIBRARIES[$ _n] = _f;
|
|
|
|
array_push(HLSL_LIBRARIES_ARR, _n);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
2023-09-08 12:27:22 +02:00
|
|
|
function Node_HLSL(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
|
|
|
|
name = "HLSL";
|
|
|
|
shader = { vs: -1, fs: -1 };
|
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
newInput(0, nodeValue_Text("Vertex", self, ""))
|
2023-09-08 12:27:22 +02:00
|
|
|
.setDisplay(VALUE_DISPLAY.codeHLSL)
|
|
|
|
.rejectArray();
|
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
newInput(1, nodeValue_Text("Main", self,
|
2023-09-08 14:51:05 +02:00
|
|
|
@"float4 surfaceColor = gm_BaseTextureObject.Sample(gm_BaseTexture, input.uv);
|
2024-08-20 10:15:53 +02:00
|
|
|
output.color = surfaceColor;"))
|
2023-09-08 12:27:22 +02:00
|
|
|
.setDisplay(VALUE_DISPLAY.codeHLSL)
|
|
|
|
.rejectArray();
|
|
|
|
|
2024-08-18 06:16:20 +02:00
|
|
|
newInput(2, nodeValue_Surface("Base Texture", self));
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
newInput(3, nodeValue_Text("Libraries", self, "" ))
|
|
|
|
.setDisplay(VALUE_DISPLAY.codeHLSL)
|
|
|
|
.rejectArray();
|
|
|
|
|
|
|
|
newInput(4, nodeValue_Text("Global", self, ""))
|
|
|
|
.setDisplay(VALUE_DISPLAY.codeHLSL)
|
|
|
|
.rejectArray();
|
|
|
|
|
2024-09-04 03:57:11 +02:00
|
|
|
newOutput(0, nodeValue_Output("Surface", self, VALUE_TYPE.surface, noone ));
|
2023-09-08 12:27:22 +02:00
|
|
|
|
|
|
|
static createNewInput = function() {
|
2024-08-08 06:57:51 +02:00
|
|
|
var index = array_length(inputs);
|
2024-08-18 06:16:20 +02:00
|
|
|
newInput(index + 0, nodeValue_Text("Argument name", self, "" ));
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2024-08-18 06:16:20 +02:00
|
|
|
newInput(index + 1, nodeValue_Enum_Scroll("Argument type", self, 0 , { data: [ "Float", "Int", "Vec2", "Vec3", "Vec4", "Mat3", "Mat4", "Sampler2D", "Color" ], update_hover: false }));
|
2024-08-08 06:57:51 +02:00
|
|
|
inputs[index + 1].editWidget.interactable = false;
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2024-08-20 10:15:53 +02:00
|
|
|
newInput(index + 2, nodeValue("Argument value", self, CONNECT_TYPE.input, VALUE_TYPE.float, 0 ))
|
2023-09-08 12:27:22 +02:00
|
|
|
.setVisible(true, true);
|
2024-08-08 06:57:51 +02:00
|
|
|
inputs[index + 2].editWidget.interactable = false;
|
2023-09-08 12:27:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
argumentRenderer();
|
|
|
|
|
2025-02-02 03:58:43 +01:00
|
|
|
#region Template
|
|
|
|
vs_string = "#define MATRIX_WORLD 0\n#define MATRIX_WORLD_VIEW 1\n#define MATRIX_WORLD_VIEW_PROJECTION 2";
|
|
|
|
vs_string += @"
|
2024-07-25 10:47:50 +02:00
|
|
|
|
|
|
|
cbuffer Matrices : register(b0) {
|
|
|
|
float4x4 gm_Matrices[3];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct VertexShaderInput {
|
|
|
|
float3 pos : POSITION;
|
|
|
|
float3 color : COLOR0;
|
|
|
|
float2 uv : TEXCOORD0;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct VertexShaderOutput {
|
|
|
|
float4 pos : SV_POSITION;
|
|
|
|
float2 uv : TEXCOORD0;
|
|
|
|
};
|
|
|
|
|
|
|
|
void main(in VertexShaderInput input, out VertexShaderOutput output) {
|
|
|
|
output.pos = mul(gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION], float4(input.pos, 1.0f));
|
|
|
|
output.uv = input.uv;
|
|
|
|
}";
|
2025-02-01 12:08:54 +01:00
|
|
|
|
2025-02-02 03:58:43 +01:00
|
|
|
fs_preMain = @"Texture2D gm_BaseTextureObject : register(t0);
|
2024-07-25 10:47:50 +02:00
|
|
|
SamplerState gm_BaseTexture : register(s0);
|
|
|
|
|
|
|
|
struct VertexShaderOutput {
|
|
|
|
float4 pos : SV_POSITION;
|
|
|
|
float2 uv : TEXCOORD0;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct PixelShaderOutput {
|
|
|
|
float4 color : SV_TARGET0;
|
|
|
|
};
|
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
";
|
2025-02-02 03:58:43 +01:00
|
|
|
fs_postMain = @"void main(in VertexShaderOutput _input, out PixelShaderOutput output) {
|
2024-07-25 10:47:50 +02:00
|
|
|
VertexShaderOutput input = _input;
|
|
|
|
";
|
2025-02-01 12:08:54 +01:00
|
|
|
|
2025-02-02 03:58:43 +01:00
|
|
|
fs_postString = "}";
|
|
|
|
#endregion
|
2024-07-25 10:47:50 +02:00
|
|
|
|
2025-02-02 03:58:43 +01:00
|
|
|
libraries = [];
|
|
|
|
libraryParams = [];
|
2025-02-01 12:08:54 +01:00
|
|
|
preMainLabel = new Inspector_Label(fs_preMain, _f_code_s);
|
|
|
|
postMainLabel = new Inspector_Label(fs_postMain, _f_code_s);
|
|
|
|
|
|
|
|
inspector_label_values = ["Values", true];
|
2024-07-25 10:47:50 +02:00
|
|
|
|
2023-09-08 12:27:22 +02:00
|
|
|
input_display_list = [ 2,
|
2025-02-01 12:08:54 +01:00
|
|
|
["Preprocessor", true], 3,
|
2024-07-27 05:46:16 +02:00
|
|
|
["Vertex Shader [read only]", true], new Inspector_Label(vs_string, _f_code_s),
|
2025-02-01 12:08:54 +01:00
|
|
|
["Fragment Shader", false], preMainLabel, 4, postMainLabel, 1, new Inspector_Label(fs_postString, _f_code_s),
|
2024-11-23 07:26:39 +01:00
|
|
|
["Arguments", false], argument_renderer,
|
2025-02-01 12:08:54 +01:00
|
|
|
inspector_label_values,
|
2023-09-08 12:27:22 +02:00
|
|
|
];
|
|
|
|
|
2024-05-23 10:59:39 +02:00
|
|
|
setDynamicInput(3, false);
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2024-07-07 09:08:13 +02:00
|
|
|
static refreshDynamicInput = function() {
|
2024-08-08 06:57:51 +02:00
|
|
|
var _in = [];
|
2023-09-15 20:12:02 +02:00
|
|
|
|
|
|
|
for( var i = 0; i < input_fix_len; i++ )
|
2024-08-08 06:57:51 +02:00
|
|
|
array_push(_in, inputs[i]);
|
2023-09-15 20:12:02 +02:00
|
|
|
|
|
|
|
array_resize(input_display_list, input_display_len);
|
|
|
|
|
2024-08-08 06:57:51 +02:00
|
|
|
for( var i = input_fix_len; i < array_length(inputs); i += data_length ) {
|
2024-08-16 13:55:58 +02:00
|
|
|
var inp_name = inputs[i].getValue();
|
|
|
|
var inp_type = inputs[i + 1];
|
|
|
|
var inp_valu = inputs[i + 2];
|
|
|
|
var cur_valu = inputs[i + 2].getValue();
|
|
|
|
|
|
|
|
if(inp_name == "") {
|
2024-08-08 06:57:51 +02:00
|
|
|
delete inputs[i + 0];
|
|
|
|
delete inputs[i + 1];
|
|
|
|
delete inputs[i + 2];
|
2023-09-15 20:12:02 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2024-08-08 06:57:51 +02:00
|
|
|
array_push(_in, inputs[i + 0]);
|
|
|
|
array_push(_in, inp_type);
|
|
|
|
array_push(_in, inp_valu);
|
2023-09-15 20:12:02 +02:00
|
|
|
|
|
|
|
inp_type.editWidget.interactable = true;
|
|
|
|
if(inp_valu.editWidget != noone)
|
|
|
|
inp_valu.editWidget.interactable = true;
|
2023-09-16 20:26:35 +02:00
|
|
|
inp_valu.name = inp_name;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
|
|
|
var type = inp_type.getValue();
|
|
|
|
switch(type) {
|
2024-07-26 05:13:25 +02:00
|
|
|
|
|
|
|
case 0 : // Float
|
2023-09-16 20:26:35 +02:00
|
|
|
if(is_array(cur_valu)) inp_valu.overrideValue(0);
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.float);
|
2023-09-15 20:12:02 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY._default);
|
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
case 1 : // Int
|
2023-09-16 20:26:35 +02:00
|
|
|
if(is_array(cur_valu)) inp_valu.overrideValue(0);
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.integer);
|
2023-09-15 20:12:02 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY._default);
|
|
|
|
break;
|
2024-07-26 05:13:25 +02:00
|
|
|
|
|
|
|
case 2 : //Vec2
|
2023-09-16 20:26:35 +02:00
|
|
|
if(!is_array(cur_valu) || array_length(cur_valu) != 2)
|
|
|
|
inp_valu.overrideValue([ 0, 0 ]);
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.float);
|
2023-09-16 20:26:35 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY.vector);
|
2023-09-15 20:12:02 +02:00
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
case 3 : //Vec3
|
2023-09-16 20:26:35 +02:00
|
|
|
if(!is_array(cur_valu) || array_length(cur_valu) != 3)
|
|
|
|
inp_valu.overrideValue([ 0, 0, 0 ]);
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.float);
|
2023-09-16 20:26:35 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY.vector);
|
2023-09-15 20:12:02 +02:00
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
case 4 : //Vec4
|
2023-09-16 20:26:35 +02:00
|
|
|
if(!is_array(cur_valu) || array_length(cur_valu) != 4)
|
|
|
|
inp_valu.overrideValue([ 0, 0, 0, 0 ]);
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.float);
|
2023-09-16 20:26:35 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY.vector);
|
2023-09-15 20:12:02 +02:00
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
case 5 : //Mat3
|
2023-09-16 20:26:35 +02:00
|
|
|
if(!is_array(cur_valu) || array_length(cur_valu) != 9)
|
|
|
|
inp_valu.overrideValue(array_create(9));
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.float);
|
2023-10-02 08:57:44 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY.matrix, { size: 3 });
|
2023-09-15 20:12:02 +02:00
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
case 6 : //Mat4
|
2023-09-16 20:26:35 +02:00
|
|
|
if(!is_array(cur_valu) || array_length(cur_valu) != 16)
|
|
|
|
inp_valu.overrideValue(array_create(16));
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.float);
|
2023-10-02 08:57:44 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY.matrix, { size: 4 });
|
2023-09-15 20:12:02 +02:00
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
case 7 : //Sampler2D
|
|
|
|
if(is_array(cur_valu))
|
|
|
|
inp_valu.overrideValue(noone);
|
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.surface);
|
2023-09-15 20:12:02 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY._default);
|
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-26 05:13:25 +02:00
|
|
|
case 8 : //Color
|
|
|
|
if(is_array(cur_valu))
|
|
|
|
inp_valu.overrideValue(c_black);
|
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
inp_valu.setType(VALUE_TYPE.color);
|
2023-09-15 20:12:02 +02:00
|
|
|
inp_valu.setDisplay(VALUE_DISPLAY._default);
|
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2023-09-15 20:12:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
array_push(input_display_list, i + 2);
|
|
|
|
}
|
|
|
|
|
2024-08-08 06:57:51 +02:00
|
|
|
for( var i = 0; i < array_length(_in); i++ )
|
2024-08-16 13:55:58 +02:00
|
|
|
_in[i].index = i;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
|
|
|
inputs = _in;
|
|
|
|
createNewInput();
|
2023-09-16 20:26:35 +02:00
|
|
|
|
|
|
|
//print("==========================");
|
|
|
|
//for( var i = 0, n = array_length(input_display_list); i < n; i++ )
|
|
|
|
// print(input_display_list[i]);
|
|
|
|
//print("==========================");
|
2024-08-16 13:55:58 +02:00
|
|
|
|
2023-09-15 20:12:02 +02:00
|
|
|
} if(!LOADING && !APPENDING) refreshDynamicInput();
|
|
|
|
|
2024-11-26 05:52:57 +01:00
|
|
|
setTrigger(1, __txt("Compile"), [ THEME.refresh_icon, 1, COLORS._main_value_positive ], function() /*=>*/ { refreshShader(); triggerRender(); });
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
setTrigger(2, __txt("Libraries"), [ THEME.libraries, 1, COLORS._main_icon ], function() /*=>*/ { dialogPanelCall(new Panel_HLSL_Libraries()); });
|
|
|
|
|
|
|
|
static step = function() { argument_renderer.showValue = inspector_label_values[1]; }
|
2023-11-30 08:55:33 +01:00
|
|
|
|
2024-07-25 10:47:50 +02:00
|
|
|
static refreshShader = function() {
|
2025-02-01 12:08:54 +01:00
|
|
|
var vs = getInputData(0);
|
|
|
|
var fs = getInputData(1);
|
|
|
|
var _lib = getInputData(3);
|
|
|
|
var _glo = getInputData(4);
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2023-11-01 08:10:25 +01:00
|
|
|
var _dir = TEMPDIR;
|
2023-10-18 14:58:55 +02:00
|
|
|
directory_verify(_dir);
|
|
|
|
|
2024-07-25 10:47:50 +02:00
|
|
|
var vs = vs_string;
|
2023-09-08 12:27:22 +02:00
|
|
|
file_text_write_all(_dir + "vout.shader", vs);
|
|
|
|
|
2024-07-27 05:46:16 +02:00
|
|
|
var fs_param = "cbuffer Data : register(b10) {\n";
|
2023-09-15 20:12:02 +02:00
|
|
|
var fs_sample = "";
|
2023-09-08 12:27:22 +02:00
|
|
|
var sampler_slot = 1;
|
|
|
|
|
2024-08-08 06:57:51 +02:00
|
|
|
for( var i = input_fix_len, n = array_length(inputs); i < n; i += data_length ) {
|
2023-10-02 08:57:44 +02:00
|
|
|
var _arg_name = getInputData(i + 0);
|
2023-09-15 20:12:02 +02:00
|
|
|
if(_arg_name == "") continue;
|
|
|
|
|
2023-10-02 08:57:44 +02:00
|
|
|
var _arg_type = getInputData(i + 1);
|
2023-09-08 12:27:22 +02:00
|
|
|
|
|
|
|
switch(_arg_type) {
|
2024-07-27 05:46:16 +02:00
|
|
|
case 0 : fs_param += $" float {_arg_name};\n"; break; // u_float
|
|
|
|
case 1 : fs_param += $" int {_arg_name};\n"; break; // u_int
|
|
|
|
case 2 : fs_param += $" float2 {_arg_name};\n"; break; // u_vec2
|
|
|
|
case 3 : fs_param += $" float3 {_arg_name};\n"; break; // u_vec3
|
|
|
|
case 4 : fs_param += $" float4 {_arg_name};\n"; break; // u_vec4
|
|
|
|
case 5 : fs_param += $" float3x3 {_arg_name};\n"; break; // u_mat3
|
|
|
|
case 6 : fs_param += $" float4x4 {_arg_name};\n"; break; // u_mat4
|
|
|
|
case 7 : // u_sampler2D
|
2023-09-15 20:12:02 +02:00
|
|
|
fs_sample += $"Texture2D {_arg_name}Object : register(t{sampler_slot});\n";
|
|
|
|
fs_sample += $"SamplerState {_arg_name} : register(s{sampler_slot});\n";
|
2023-09-08 12:27:22 +02:00
|
|
|
sampler_slot++;
|
|
|
|
break;
|
2024-07-07 09:08:13 +02:00
|
|
|
|
2024-07-27 05:46:16 +02:00
|
|
|
case 8 : fs_param += $" float4 {_arg_name};\n"; break; // u_vec4 color
|
2023-09-08 12:27:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-09-15 20:12:02 +02:00
|
|
|
fs_param += "};\n";
|
|
|
|
fs_param += fs_sample;
|
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
_lib = string_replace(_lib, "\n", "");
|
|
|
|
var _libs = string_splice(_lib, ";");
|
|
|
|
|
|
|
|
if(project.data[$ "hlsl"] == undefined)
|
|
|
|
project.data[$ "hlsl"] = {};
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2025-02-02 03:58:43 +01:00
|
|
|
libraries = [];
|
|
|
|
libraryParams = [];
|
|
|
|
var fs_lib = "\n";
|
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
for( var i = 0, n = array_length(_libs); i < n; i++ ) {
|
|
|
|
var _l = _libs[i];
|
|
|
|
var _ll = _l;
|
|
|
|
_ll = string_replace(_ll, "using", "");
|
|
|
|
_ll = string_replace(_ll, ";", "");
|
|
|
|
_ll = string_replace(_ll, "\"", "");
|
|
|
|
_ll = string_trim(_ll);
|
|
|
|
|
|
|
|
if(_ll == "") continue;
|
|
|
|
|
|
|
|
if(!struct_has(project.data.hlsl, _ll)) {
|
|
|
|
if(!struct_has(HLSL_LIBRARIES, _ll)) { noti_warning($"HLSL error: library '{_ll}' not found."); continue; }
|
|
|
|
project.data.hlsl[$ _ll] = file_read_all(HLSL_LIBRARIES[$ _ll])
|
|
|
|
}
|
|
|
|
|
2025-02-02 03:58:43 +01:00
|
|
|
array_push(libraries, _ll);
|
|
|
|
array_append(libraryParams, hlsl_document_parser(project.data.hlsl[$ _ll]));
|
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
fs_lib += $"{project.data.hlsl[$ _ll]}\n";
|
|
|
|
}
|
|
|
|
fs_lib += "\n";
|
|
|
|
|
|
|
|
var _fs_preString = fs_param + fs_preMain;
|
|
|
|
var _fs = fs_lib + _fs_preString + _glo + "\n" + fs_postMain + fs + fs_postString;
|
|
|
|
file_text_write_all(_dir + "fout.shader", _fs);
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2025-02-01 12:08:54 +01:00
|
|
|
preMainLabel.text = _fs_preString;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2023-09-08 12:27:22 +02:00
|
|
|
shader.vs = d3d11_shader_compile_vs(_dir + "vout.shader", "main", "vs_4_0");
|
|
|
|
if (!d3d11_shader_exists(shader.vs))
|
2023-09-08 14:51:05 +02:00
|
|
|
noti_warning(d3d11_get_error_string());
|
2023-09-08 12:27:22 +02:00
|
|
|
|
|
|
|
shader.fs = d3d11_shader_compile_ps(_dir + "fout.shader", "main", "ps_4_0");
|
|
|
|
if (!d3d11_shader_exists(shader.fs))
|
2023-09-08 14:51:05 +02:00
|
|
|
noti_warning(d3d11_get_error_string());
|
2024-07-25 10:47:50 +02:00
|
|
|
} if(!LOADING && !APPENDING) refreshShader();
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2024-07-25 10:47:50 +02:00
|
|
|
static onValueUpdate = function(index) {
|
2024-03-14 14:35:19 +01:00
|
|
|
var _refresh = index == 0 || index == 1 || (index >= input_fix_len && (index - input_fix_len) % data_length != 2);
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2023-09-16 20:26:35 +02:00
|
|
|
if(_refresh) {
|
|
|
|
refreshShader();
|
|
|
|
refreshDynamicInput();
|
|
|
|
}
|
2024-07-25 10:47:50 +02:00
|
|
|
}
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2025-02-02 03:58:43 +01:00
|
|
|
static onCodeEdited = function() {
|
|
|
|
var _global_edit = inputs[4].editWidget;
|
|
|
|
var _fsmain_edit = inputs[1].editWidget;
|
|
|
|
var _globalParams = array_clone(_global_edit.localParams);
|
|
|
|
array_append(_globalParams, libraryParams);
|
|
|
|
|
|
|
|
_global_edit.globalParams = libraryParams;
|
|
|
|
_fsmain_edit.globalParams = _globalParams;
|
|
|
|
}
|
|
|
|
|
2024-07-25 10:47:50 +02:00
|
|
|
static processData = function(_output, _data, _output_index, _array_index = 0) {
|
2025-02-02 03:58:43 +01:00
|
|
|
onCodeEdited();
|
|
|
|
|
2023-09-08 12:27:22 +02:00
|
|
|
var _surf = _data[2];
|
2023-09-15 20:12:02 +02:00
|
|
|
if(!is_surface(_surf)) return noone;
|
|
|
|
if(!d3d11_shader_exists(shader.vs)) return noone;
|
2023-09-16 20:26:35 +02:00
|
|
|
if(!d3d11_shader_exists(shader.fs)) return noone;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2023-09-08 21:37:36 +02:00
|
|
|
_output = surface_verify(_output, surface_get_width_safe(_surf), surface_get_height_safe(_surf));
|
2024-02-25 11:02:10 +01:00
|
|
|
|
2023-09-08 12:27:22 +02:00
|
|
|
surface_set_target(_output);
|
2024-02-25 11:02:10 +01:00
|
|
|
DRAW_CLEAR
|
2024-09-24 11:51:04 +02:00
|
|
|
BLEND_OVERRIDE
|
2024-02-25 11:02:10 +01:00
|
|
|
|
|
|
|
// ############################ SET SHADER ############################
|
|
|
|
d3d11_shader_override_vs(shader.vs);
|
|
|
|
d3d11_shader_override_ps(shader.fs);
|
|
|
|
|
|
|
|
#region uniforms
|
|
|
|
var uTypes = array_create(8, 0);
|
|
|
|
var sampler_slot = 1;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
d3d11_cbuffer_begin();
|
|
|
|
var _buffer = buffer_create(1, buffer_grow, 1);
|
|
|
|
var _cbSize = 0;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
for( var i = input_fix_len, n = array_length(_data); i < n; i += data_length ) {
|
|
|
|
var _arg_name = _data[i + 0];
|
|
|
|
var _arg_type = _data[i + 1];
|
|
|
|
var _arg_valu = _data[i + 2];
|
2023-09-16 11:04:50 +02:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
if(_arg_name == "") continue;
|
2025-01-10 03:04:53 +01:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
switch(_arg_type) {
|
2024-07-27 05:46:16 +02:00
|
|
|
case 0 : // u_float
|
|
|
|
d3d11_cbuffer_add_float(1);
|
2024-02-25 11:02:10 +01:00
|
|
|
_cbSize++;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2024-07-27 05:46:16 +02:00
|
|
|
buffer_write(_buffer, buffer_f32, _arg_valu);
|
2024-02-25 11:02:10 +01:00
|
|
|
break;
|
2024-07-27 05:46:16 +02:00
|
|
|
case 1 : // u_int
|
|
|
|
d3d11_cbuffer_add_int(1);
|
2024-02-25 11:02:10 +01:00
|
|
|
_cbSize++;
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2024-07-27 05:46:16 +02:00
|
|
|
buffer_write(_buffer, buffer_s32, _arg_valu);
|
2024-02-25 11:02:10 +01:00
|
|
|
break;
|
2024-07-27 05:46:16 +02:00
|
|
|
|
|
|
|
case 2 : // u_vec2
|
|
|
|
case 3 : // u_vec3
|
|
|
|
case 4 : // u_vec4
|
|
|
|
case 5 : // u_mat3
|
|
|
|
case 6 : // u_mat4
|
2024-02-25 11:02:10 +01:00
|
|
|
if(is_array(_arg_valu)) {
|
|
|
|
d3d11_cbuffer_add_float(array_length(_arg_valu));
|
|
|
|
_cbSize += array_length(_arg_valu);
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
for( var j = 0, m = array_length(_arg_valu); j < m; j++ )
|
2024-07-27 05:46:16 +02:00
|
|
|
buffer_write(_buffer, buffer_f32, _arg_valu[j]);
|
2024-02-25 11:02:10 +01:00
|
|
|
}
|
|
|
|
break;
|
2024-07-27 05:46:16 +02:00
|
|
|
|
|
|
|
case 7 : // u_sampler2D
|
2024-02-25 11:02:10 +01:00
|
|
|
if(is_surface(_arg_valu))
|
|
|
|
d3d11_texture_set_stage_ps(sampler_slot, surface_get_texture(_arg_valu));
|
|
|
|
sampler_slot++;
|
|
|
|
break;
|
2024-07-27 05:46:16 +02:00
|
|
|
|
|
|
|
case 8 : // u_vec4 color
|
|
|
|
var _clr = colToVec4(_arg_valu);
|
|
|
|
d3d11_cbuffer_add_float(4);
|
|
|
|
_cbSize += 4;
|
|
|
|
|
|
|
|
for( var j = 0; j < 4; j++ )
|
|
|
|
buffer_write(_buffer, buffer_f32, _clr[j]);
|
|
|
|
break;
|
2024-02-25 11:02:10 +01:00
|
|
|
}
|
|
|
|
}
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
d3d11_cbuffer_add_float(4 - _cbSize % 4);
|
|
|
|
var cbuff = d3d11_cbuffer_end();
|
|
|
|
d3d11_cbuffer_update(cbuff, _buffer);
|
|
|
|
buffer_delete(_buffer);
|
|
|
|
|
|
|
|
d3d11_shader_set_cbuffer_ps(10, cbuff);
|
|
|
|
#endregion
|
2023-09-15 20:12:02 +02:00
|
|
|
|
2024-02-25 11:02:10 +01:00
|
|
|
matrix_set(matrix_world, matrix_build(0, 0, 0, 0, 0, 0, surface_get_width_safe(_surf), surface_get_height_safe(_surf), 1));
|
|
|
|
vertex_submit(global.HLSL_VB_PLANE, pr_trianglestrip, surface_get_texture(_surf));
|
|
|
|
matrix_set(matrix_world, matrix_build_identity());
|
|
|
|
|
|
|
|
d3d11_shader_override_vs(-1);
|
|
|
|
d3d11_shader_override_ps(-1);
|
2024-09-24 11:51:04 +02:00
|
|
|
|
|
|
|
BLEND_NORMAL
|
2023-09-08 12:27:22 +02:00
|
|
|
surface_reset_target();
|
|
|
|
|
|
|
|
return _output;
|
2024-07-25 10:47:50 +02:00
|
|
|
}
|
2023-09-08 12:27:22 +02:00
|
|
|
|
2023-10-07 16:23:40 +02:00
|
|
|
static postLoad = function() {
|
2023-09-16 20:26:35 +02:00
|
|
|
refreshShader();
|
|
|
|
refreshDynamicInput();
|
|
|
|
}
|
2023-09-08 12:27:22 +02:00
|
|
|
}
|