mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2024-12-24 22:16:17 +01:00
- [Text Inputs] Selecting text with mouse now move the cursor properly.
This commit is contained in:
parent
679a171ef1
commit
29d85de951
31 changed files with 215 additions and 496 deletions
|
@ -219,7 +219,7 @@
|
|||
{"name":"sh_fd_add_velocity_glsl","order":1,"path":"shaders/sh_fd_add_velocity_glsl/sh_fd_add_velocity_glsl.yy",},
|
||||
{"name":"s_node_normal","order":30,"path":"sprites/s_node_normal/s_node_normal.yy",},
|
||||
{"name":"node_pixel_sort","order":12,"path":"scripts/node_pixel_sort/node_pixel_sort.yy",},
|
||||
{"name":"node_glsl","order":13,"path":"scripts/node_glsl/node_glsl.yy",},
|
||||
{"name":"node_hlsl","order":13,"path":"scripts/node_hlsl/node_hlsl.yy",},
|
||||
{"name":"sh_dither","order":28,"path":"shaders/sh_dither/sh_dither.yy",},
|
||||
{"name":"__vec2","order":7,"path":"scripts/__vec2/__vec2.yy",},
|
||||
{"name":"node_region_fill","order":20,"path":"scripts/node_region_fill/node_region_fill.yy",},
|
||||
|
|
|
@ -751,7 +751,7 @@
|
|||
{"id":{"name":"sh_fd_add_velocity_glsl","path":"shaders/sh_fd_add_velocity_glsl/sh_fd_add_velocity_glsl.yy",},},
|
||||
{"id":{"name":"s_node_normal","path":"sprites/s_node_normal/s_node_normal.yy",},},
|
||||
{"id":{"name":"node_pixel_sort","path":"scripts/node_pixel_sort/node_pixel_sort.yy",},},
|
||||
{"id":{"name":"node_glsl","path":"scripts/node_glsl/node_glsl.yy",},},
|
||||
{"id":{"name":"node_hlsl","path":"scripts/node_hlsl/node_hlsl.yy",},},
|
||||
{"id":{"name":"sh_dither","path":"shaders/sh_dither/sh_dither.yy",},},
|
||||
{"id":{"name":"__vec2","path":"scripts/__vec2/__vec2.yy",},},
|
||||
{"id":{"name":"control_function","path":"scripts/control_function/control_function.yy",},},
|
||||
|
@ -1521,7 +1521,7 @@
|
|||
{"id":{"name":"sh_surface_replace_replace","path":"shaders/sh_surface_replace_replace/sh_surface_replace_replace.yy",},},
|
||||
{"id":{"name":"node_ase_file_read","path":"scripts/node_ase_file_read/node_ase_file_read.yy",},},
|
||||
{"id":{"name":"s_workshop_frame","path":"sprites/s_workshop_frame/s_workshop_frame.yy",},},
|
||||
{"id":{"name":"glsl_draw","path":"scripts/glsl_draw/glsl_draw.yy",},},
|
||||
{"id":{"name":"hlsl_draw","path":"scripts/hlsl_draw/hlsl_draw.yy",},},
|
||||
{"id":{"name":"s_node_print","path":"sprites/s_node_print/s_node_print.yy",},},
|
||||
{"id":{"name":"sh_seperate_shape_counter","path":"shaders/sh_seperate_shape_counter/sh_seperate_shape_counter.yy",},},
|
||||
{"id":{"name":"s_node_stack","path":"sprites/s_node_stack/s_node_stack.yy",},},
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,28 +0,0 @@
|
|||
// Uniforms look like they're shared between vertex and fragment shaders in GLSL, so we have to be careful to avoid name clashes
|
||||
|
||||
uniform sampler2D gm_BaseTexture;
|
||||
|
||||
uniform bool gm_PS_FogEnabled;
|
||||
uniform vec4 gm_FogColour;
|
||||
uniform bool gm_AlphaTestEnabled;
|
||||
uniform float gm_AlphaRefValue;
|
||||
|
||||
void DoAlphaTest(vec4 SrcColour)
|
||||
{
|
||||
if (gm_AlphaTestEnabled)
|
||||
{
|
||||
if (SrcColour.a <= gm_AlphaRefValue)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoFog(inout vec4 SrcColour, float fogval)
|
||||
{
|
||||
if (gm_PS_FogEnabled)
|
||||
{
|
||||
SrcColour = mix(SrcColour, gm_FogColour, clamp(fogval, 0.0, 1.0));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
// GameMaker reserved and common types/inputs
|
||||
|
||||
Texture2D gm_BaseTextureObject : register(t0);
|
||||
SamplerState gm_BaseTexture : register(S0);
|
||||
|
||||
cbuffer gm_PSMaterialConstantBuffer
|
||||
{
|
||||
bool gm_PS_FogEnabled;
|
||||
float4 gm_FogColour;
|
||||
bool gm_AlphaTestEnabled;
|
||||
float4 gm_AlphaRefValue;
|
||||
};
|
|
@ -1,30 +0,0 @@
|
|||
#define MATRIX_VIEW 0
|
||||
#define MATRIX_PROJECTION 1
|
||||
#define MATRIX_WORLD 2
|
||||
#define MATRIX_WORLD_VIEW 3
|
||||
#define MATRIX_WORLD_VIEW_PROJECTION 4
|
||||
#define MATRICES_MAX 5
|
||||
|
||||
cbuffer gm_VSTransformBuffer
|
||||
{
|
||||
float4x4 gm_Matrices[MATRICES_MAX];
|
||||
};
|
||||
|
||||
cbuffer gm_VSMaterialConstantBuffer
|
||||
{
|
||||
bool gm_LightingEnabled;
|
||||
bool gm_VS_FogEnabled;
|
||||
float gm_FogStart;
|
||||
float gm_RcpFogRange;
|
||||
};
|
||||
|
||||
#define MAX_VS_LIGHTS 8
|
||||
|
||||
cbuffer gm_VSLightingConstantBuffer
|
||||
{
|
||||
float4 gm_AmbientColour; // rgb=colour, a=1
|
||||
float3 gm_Lights_Direction[MAX_VS_LIGHTS]; // normalised direction
|
||||
float4 gm_Lights_PosRange[MAX_VS_LIGHTS]; // X,Y,Z position, W range
|
||||
float4 gm_Lights_Colour[MAX_VS_LIGHTS]; // rgb=colour, a=1
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
// GameMaker reserved and common types/inputs
|
||||
|
||||
sampler2D gm_BaseTexture : register(S0);
|
||||
|
||||
bool gm_PS_FogEnabled;
|
||||
float4 gm_FogColour;
|
||||
bool gm_AlphaTestEnabled;
|
||||
float4 gm_AlphaRefValue;
|
|
@ -1,20 +0,0 @@
|
|||
#define MATRIX_VIEW 0
|
||||
#define MATRIX_PROJECTION 1
|
||||
#define MATRIX_WORLD 2
|
||||
#define MATRIX_WORLD_VIEW 3
|
||||
#define MATRIX_WORLD_VIEW_PROJECTION 4
|
||||
#define MATRICES_MAX 5
|
||||
|
||||
float4x4 gm_Matrices[MATRICES_MAX] : register(c0);
|
||||
|
||||
bool gm_LightingEnabled;
|
||||
bool gm_VS_FogEnabled;
|
||||
float gm_FogStart;
|
||||
float gm_RcpFogRange;
|
||||
|
||||
#define MAX_VS_LIGHTS 8
|
||||
float4 gm_AmbientColour; // rgb=colour, a=1
|
||||
float3 gm_Lights_Direction[MAX_VS_LIGHTS]; // normalised direction
|
||||
float4 gm_Lights_PosRange[MAX_VS_LIGHTS]; // X,Y,Z position, W range
|
||||
float4 gm_Lights_Colour[MAX_VS_LIGHTS]; // rgb=colour, a=1
|
||||
|
Binary file not shown.
|
@ -1,118 +0,0 @@
|
|||
#define MATRIX_VIEW 0
|
||||
#define MATRIX_PROJECTION 1
|
||||
#define MATRIX_WORLD 2
|
||||
#define MATRIX_WORLD_VIEW 3
|
||||
#define MATRIX_WORLD_VIEW_PROJECTION 4
|
||||
#define MATRICES_MAX 5
|
||||
|
||||
uniform mat4 gm_Matrices[MATRICES_MAX];
|
||||
|
||||
uniform bool gm_LightingEnabled;
|
||||
uniform bool gm_VS_FogEnabled;
|
||||
uniform float gm_FogStart;
|
||||
uniform float gm_RcpFogRange;
|
||||
|
||||
#define MAX_VS_LIGHTS 8
|
||||
#define MIRROR_WIN32_LIGHTING_EQUATION
|
||||
|
||||
|
||||
//#define MAX_VS_LIGHTS 8
|
||||
uniform vec4 gm_AmbientColour; // rgb=colour, a=1
|
||||
uniform vec4 gm_Lights_Direction[MAX_VS_LIGHTS]; // normalised direction
|
||||
uniform vec4 gm_Lights_PosRange[MAX_VS_LIGHTS]; // X,Y,Z position, W range
|
||||
uniform vec4 gm_Lights_Colour[MAX_VS_LIGHTS]; // rgb=colour, a=1
|
||||
|
||||
float CalcFogFactor(vec4 pos)
|
||||
{
|
||||
if (gm_VS_FogEnabled)
|
||||
{
|
||||
vec4 viewpos = gm_Matrices[MATRIX_WORLD_VIEW] * pos;
|
||||
float fogfactor = ((viewpos.z - gm_FogStart) * gm_RcpFogRange);
|
||||
return fogfactor;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
vec4 DoDirLight(vec3 ws_normal, vec4 dir, vec4 diffusecol)
|
||||
{
|
||||
float dotresult = dot(ws_normal, dir.xyz);
|
||||
dotresult = min(dotresult, dir.w); // the w component is 1 if the directional light is active, or 0 if it isn't
|
||||
dotresult = max(0.0, dotresult);
|
||||
|
||||
return dotresult * diffusecol;
|
||||
}
|
||||
|
||||
vec4 DoPointLight(vec3 ws_pos, vec3 ws_normal, vec4 posrange, vec4 diffusecol)
|
||||
{
|
||||
vec3 diffvec = ws_pos - posrange.xyz;
|
||||
float veclen = length(diffvec);
|
||||
diffvec /= veclen; // normalise
|
||||
float atten;
|
||||
if (posrange.w == 0.0) // the w component of posrange is 0 if the point light is disabled - if we don't catch it here we might end up generating INFs or NaNs
|
||||
{
|
||||
atten = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef MIRROR_WIN32_LIGHTING_EQUATION
|
||||
// This is based on the Win32 D3D and OpenGL falloff model, where:
|
||||
// Attenuation = 1.0f / (factor0 + (d * factor1) + (d*d * factor2))
|
||||
// For some reason, factor0 is set to 0.0f while factor1 is set to 1.0f/lightrange (on both D3D and OpenGL)
|
||||
// This'll result in no visible falloff as 1.0f / (d / lightrange) will always be larger than 1.0f (if the vertex is within range)
|
||||
|
||||
atten = 1.0 / (veclen / posrange.w);
|
||||
if (veclen > posrange.w)
|
||||
{
|
||||
atten = 0.0;
|
||||
}
|
||||
#else
|
||||
atten = clamp( (1.0 - (veclen / posrange.w)), 0.0, 1.0); // storing 1.0f/range instead would save a rcp
|
||||
#endif
|
||||
}
|
||||
float dotresult = dot(ws_normal, diffvec);
|
||||
dotresult = max(0.0, dotresult);
|
||||
|
||||
return dotresult * atten * diffusecol;
|
||||
}
|
||||
|
||||
vec4 DoLighting(vec4 vertexcolour, vec4 objectspacepos, vec3 objectspacenormal)
|
||||
{
|
||||
if (gm_LightingEnabled)
|
||||
{
|
||||
// Normally we'd have the light positions\\directions back-transformed from world to object space
|
||||
// But to keep things simple for the moment we'll just transform the normal to world space
|
||||
vec4 objectspacenormal4 = vec4(objectspacenormal, 0.0);
|
||||
vec3 ws_normal;
|
||||
ws_normal = (gm_Matrices[MATRIX_WORLD] * objectspacenormal4).xyz;
|
||||
ws_normal = normalize(ws_normal);
|
||||
|
||||
vec3 ws_pos;
|
||||
ws_pos = (gm_Matrices[MATRIX_WORLD] * objectspacepos).xyz;
|
||||
|
||||
// Accumulate lighting from different light types
|
||||
vec4 accumcol = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
for(int i = 0; i < MAX_VS_LIGHTS; i++)
|
||||
{
|
||||
accumcol += DoDirLight(ws_normal, gm_Lights_Direction[i], gm_Lights_Colour[i]);
|
||||
}
|
||||
|
||||
for(int i = 0; i < MAX_VS_LIGHTS; i++)
|
||||
{
|
||||
accumcol += DoPointLight(ws_pos, ws_normal, gm_Lights_PosRange[i], gm_Lights_Colour[i]);
|
||||
}
|
||||
|
||||
accumcol *= vertexcolour;
|
||||
accumcol += gm_AmbientColour;
|
||||
accumcol = min(vec4(1.0, 1.0, 1.0, 1.0), accumcol);
|
||||
accumcol.a = vertexcolour.a;
|
||||
return accumcol;
|
||||
}
|
||||
else
|
||||
{
|
||||
return vertexcolour;
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -27,8 +27,7 @@ event_inherited();
|
|||
|
||||
content.in_dialog = true;
|
||||
|
||||
if(instanceof(content) == "Panel_Menu")
|
||||
destroy_on_click_out = false;
|
||||
if(content.auto_pin) destroy_on_click_out = false;
|
||||
}
|
||||
|
||||
function resetMask() {
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
global.glsl_reserved = ds_map_create();
|
||||
global.glsl_constant = ds_map_create();
|
||||
|
||||
var reserved = ["int", "float", "bool", "vec2", "vec3", "vec4", "mat3", "mat4", "sampler2D",
|
||||
var reserved = ["int", "float", "float2", "float3", "float4", "float3x3", "float4x4", "Texture2D", "SamplerState", "uniform",
|
||||
"gl_position", "gm_Matrices", "gl_FragColor", "gm_BaseTexture",
|
||||
"and", "break", "do", "else", "elseif", "end", "false",
|
||||
"and", "break", "do", "else", "end", "false",
|
||||
"for", "function", "if", "in", "local", "nil", "not",
|
||||
"or", "repeat", "return", "then", "true", "until", "while"];
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"resourceType": "GMScript",
|
||||
"resourceVersion": "1.0",
|
||||
"name": "glsl_draw",
|
||||
"name": "hlsl_draw",
|
||||
"isCompatibility": false,
|
||||
"isDnD": false,
|
||||
"parent": {
|
|
@ -183,12 +183,11 @@ function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _foc
|
|||
|
||||
if(jun.expUse || jun.type == VALUE_TYPE.text) {
|
||||
bx -= ui(28);
|
||||
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, __txtx("panel_inspector_pop_text", "Pop up Editor"), THEME.text_popup, 0, COLORS._main_icon) == 2) {
|
||||
var _panel = noone;
|
||||
|
||||
if(jun.expUse) _panel = dialogPanelCall(new Panel_Text_Editor(jun.express_edit, function() { return context.expression; }, jun));
|
||||
else _panel = dialogPanelCall(new Panel_Text_Editor(jun.editWidget, function() { return context.showValue(); }, jun));
|
||||
_panel.content.title = $"{jun.node.name} - {jun.name}";
|
||||
var cc = jun.popup_dialog == noone? COLORS._main_icon : COLORS._main_value_positive;
|
||||
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, __txtx("panel_inspector_pop_text", "Pop up Editor"), THEME.text_popup, 0, cc) == 2) {
|
||||
if(jun.expUse) jun.popup_dialog = dialogPanelCall(new Panel_Text_Editor(jun.express_edit, function() { return context.expression; }, jun));
|
||||
else jun.popup_dialog = dialogPanelCall(new Panel_Text_Editor(jun.editWidget, function() { return context.showValue(); }, jun));
|
||||
jun.popup_dialog.content.title = $"{jun.node.name} - {jun.name}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -202,8 +202,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
|
|||
converter = working_directory + "ImageMagick/convert.exe";
|
||||
magick = working_directory + "ImageMagick/magick.exe";
|
||||
webp = working_directory + "webp/webpmux.exe";
|
||||
|
||||
gifski = working_directory + "gifski\\win\\gifski.exe";
|
||||
gifski = working_directory + "gifski\\win\\gifski.exe";
|
||||
|
||||
static onValueUpdate = function(_index) {
|
||||
var form = inputs[| 3].getValue();
|
||||
|
|
|
@ -1,237 +0,0 @@
|
|||
globalvar CUSTOM_SHADER_SLOT, CUSTOM_SHADER_UNIFORM;
|
||||
CUSTOM_SHADER_SLOT = ds_map_create();
|
||||
CUSTOM_SHADER_SLOT[? sh_dummy_0] = noone;
|
||||
|
||||
CUSTOM_SHADER_UNIFORM = @"
|
||||
uniform float u_float_0, u_float_1, u_float_2, u_float_3, u_float_4, u_float_5, u_float_6, u_float_7;
|
||||
uniform float u_float_8, u_float_9, u_float_10, u_float_11, u_float_12, u_float_13, u_float_14, u_float_15;
|
||||
|
||||
uniform int u_int_0, u_int_1, u_int_2, u_int_3, u_int_4, u_int_5, u_int_6, u_int_7;
|
||||
uniform int u_int_8, u_int_9, u_int_10, u_int_11, u_int_12, u_int_13, u_int_14, u_int_15;
|
||||
|
||||
uniform vec2 u_vec2_0, u_vec2_1, u_vec2_2, u_vec2_3, u_vec2_4, u_vec2_5, u_vec2_6, u_vec2_7;
|
||||
uniform vec2 u_vec2_8, u_vec2_9, u_vec2_10, u_vec2_11, u_vec2_12, u_vec2_13, u_vec2_14, u_vec2_15;
|
||||
|
||||
uniform vec3 u_vec3_0, u_vec3_1, u_vec3_2, u_vec3_3, u_vec3_4, u_vec3_5, u_vec3_6, u_vec3_7;
|
||||
uniform vec3 u_vec3_8, u_vec3_9, u_vec3_10, u_vec3_11, u_vec3_12, u_vec3_13, u_vec3_14, u_vec3_15;
|
||||
|
||||
uniform vec4 u_vec4_0, u_vec4_1, u_vec4_2, u_vec4_3, u_vec4_4, u_vec4_5, u_vec4_6, u_vec4_7;
|
||||
uniform vec4 u_vec4_8, u_vec4_9, u_vec4_10, u_vec4_11, u_vec4_12, u_vec4_13, u_vec4_14, u_vec4_15;
|
||||
|
||||
uniform mat3 u_mat3_0, u_mat3_1, u_mat3_2, u_mat3_3, u_mat3_4, u_mat3_5, u_mat3_6, u_mat3_7;
|
||||
uniform mat3 u_mat3_8, u_mat3_9, u_mat3_10, u_mat3_11, u_mat3_12, u_mat3_13, u_mat3_14, u_mat3_15;
|
||||
|
||||
uniform mat4 u_mat4_0, u_mat4_1, u_mat4_2, u_mat4_3, u_mat4_4, u_mat4_5, u_mat4_6, u_mat4_7;
|
||||
uniform mat4 u_mat4_8, u_mat4_9, u_mat4_10, u_mat4_11, u_mat4_12, u_mat4_13, u_mat4_14, u_mat4_15;
|
||||
|
||||
uniform sampler2D u_sampler2D_0, u_sampler2D_1, u_sampler2D_2, u_sampler2D_3, u_sampler2D_4, u_sampler2D_5, u_sampler2D_6; ";
|
||||
|
||||
function custom_shader_reserve(node) {
|
||||
var keys = ds_map_keys_to_array(CUSTOM_SHADER_SLOT);
|
||||
for( var i = 0, n = array_length(keys); i < n; i++ ) {
|
||||
if(CUSTOM_SHADER_SLOT[? keys[i]] == noone) {
|
||||
CUSTOM_SHADER_SLOT[? keys[i]] = node;
|
||||
return keys[i];
|
||||
}
|
||||
}
|
||||
|
||||
return noone;
|
||||
}
|
||||
|
||||
function custom_shader_free(node) {
|
||||
var keys = ds_map_keys_to_array(CUSTOM_SHADER_SLOT);
|
||||
for( var i = 0, n = array_length(keys); i < n; i++ ) {
|
||||
if(CUSTOM_SHADER_SLOT[? keys[i]] == node)
|
||||
CUSTOM_SHADER_SLOT[? keys[i]] = noone;
|
||||
}
|
||||
}
|
||||
|
||||
function glsl_wrap_vertex(content) {
|
||||
return @"
|
||||
attribute vec3 in_Position;
|
||||
attribute vec4 in_Colour;
|
||||
attribute vec2 in_TextureCoord;
|
||||
" + CUSTOM_SHADER_UNIFORM + @"
|
||||
varying vec2 v_vTexcoord;
|
||||
|
||||
void main() {
|
||||
" + string(content) + "\n}";
|
||||
}
|
||||
|
||||
function glsl_wrap_fragment(content) {
|
||||
return @"
|
||||
varying vec2 v_vTexcoord;
|
||||
" + CUSTOM_SHADER_UNIFORM + @"
|
||||
void main() {
|
||||
" + string(content) + "\n}";
|
||||
}
|
||||
|
||||
function Node_GLSL(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
|
||||
name = "GLSL";
|
||||
shader = custom_shader_reserve(self);
|
||||
|
||||
hlslCompiler = working_directory + "HLSL/HLSLCompiler.exe";
|
||||
|
||||
inputs[| 0] = nodeValue("Vertex", self, JUNCTION_CONNECT.input, VALUE_TYPE.text,
|
||||
@"vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
|
||||
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
|
||||
v_vTexcoord = in_TextureCoord;")
|
||||
.setDisplay(VALUE_DISPLAY.codeGLSL)
|
||||
.rejectArray();
|
||||
|
||||
inputs[| 1] = nodeValue("Fragment", self, JUNCTION_CONNECT.input, VALUE_TYPE.text,
|
||||
@"gl_FragColor = texture2D( gm_BaseTexture, v_vTexcoord );")
|
||||
.setDisplay(VALUE_DISPLAY.codeGLSL)
|
||||
.rejectArray();
|
||||
|
||||
inputs[| 2] = nodeValue("Base Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone);
|
||||
|
||||
outputs[| 0] = nodeValue("Surface", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone );
|
||||
|
||||
static createNewInput = function() {
|
||||
var index = ds_list_size(inputs);
|
||||
inputs[| index + 0] = nodeValue("Argument name", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" );
|
||||
|
||||
inputs[| index + 1] = nodeValue("Argument type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0 )
|
||||
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Float", "Int", "Vec2", "Vec3", "Vec4", "Mat3", "Mat4", "Sampler2D" ], { update_hover: false });
|
||||
inputs[| index + 1].editWidget.interactable = false;
|
||||
|
||||
inputs[| index + 2] = nodeValue("Argument value", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 )
|
||||
.setVisible(true, true);
|
||||
inputs[| index + 2].editWidget.interactable = false;
|
||||
}
|
||||
|
||||
argumentRenderer();
|
||||
|
||||
input_display_list = [ 2,
|
||||
["Shader", false], 1,
|
||||
["Arguments", false], argument_renderer,
|
||||
];
|
||||
|
||||
setIsDynamicInput(3);
|
||||
|
||||
uniform_name = [
|
||||
"u_float_",
|
||||
"u_int_",
|
||||
"u_vec2_",
|
||||
"u_vec3_",
|
||||
"u_vec4_",
|
||||
"u_mat3_",
|
||||
"u_mat4_",
|
||||
"u_sampler2D_",
|
||||
];
|
||||
|
||||
insp1UpdateTooltip = __txt("Compile");
|
||||
insp1UpdateIcon = [ THEME.refresh, 1, COLORS._main_value_positive ];
|
||||
|
||||
static onInspector1Update = function() { //compile
|
||||
refreshShader();
|
||||
}
|
||||
|
||||
static refreshShader = function() {
|
||||
var vs = inputs[| 0].getValue();
|
||||
var fs = inputs[| 1].getValue();
|
||||
|
||||
var uTypes = array_create(8, 0);
|
||||
for( var i = input_fix_len, n = ds_list_size(inputs); i < n; i += data_length ) {
|
||||
var _arg_name = inputs[| i + 0].getValue();
|
||||
var _arg_type = inputs[| i + 1].getValue();
|
||||
|
||||
var _index = uTypes[_arg_type];
|
||||
uTypes[_arg_type]++;
|
||||
var _uni_name = uniform_name + string(_index);
|
||||
|
||||
vs = string_replace_all(vs, _arg_name, _uni_name);
|
||||
fs = string_replace_all(fs, _arg_name, _uni_name);
|
||||
}
|
||||
|
||||
vs = glsl_wrap_vertex(vs);
|
||||
fs = glsl_wrap_fragment(fs);
|
||||
|
||||
var _dir = DIRECTORY + "shadertemp/";
|
||||
directory_create(_dir);
|
||||
|
||||
file_text_write_all(_dir + "temp.shader",
|
||||
vs
|
||||
+ "\n//######################_==_YOYO_SHADER_MARKER_==_######################@~\n"
|
||||
+ fs
|
||||
);
|
||||
|
||||
//print(file_text_read_all(_dir + "temp.shader"));
|
||||
//print(hlslCompiler);
|
||||
|
||||
var cmd = (scr_cmd_arg(hlslCompiler)
|
||||
+ " -hlsl11"
|
||||
+ " -shader " + scr_cmd_arg(_dir + "temp.shader")
|
||||
+ " -name temp"
|
||||
+ " -out " + scr_cmd_arg(_dir)
|
||||
+ " -typedefine " + scr_cmd_arg("#define _YY_HLSL11_ 1")
|
||||
+ " -preamble " + scr_cmd_arg(filename_dir(hlslCompiler))
|
||||
);
|
||||
//
|
||||
var ex = execute_program_pipe(cmd, 0
|
||||
| program_pipe_flags_hide_window
|
||||
| program_pipe_flags_capture_stdout
|
||||
| program_pipe_flags_capture_stderr
|
||||
);
|
||||
|
||||
//print(ex)
|
||||
|
||||
if (ex[0] != 0) { // didn't even run
|
||||
noti_warning($"Error executing HLSLCompiler: {ex[2]}");
|
||||
} else if (ex[1] != 0) { // errored out
|
||||
noti_warning($"Error compiling the shader: {ex[2]}");
|
||||
} else { // OK! Let's pick up those shaders
|
||||
var vsh = file_text_read_all(_dir + "vout.shader");
|
||||
var fsh = file_text_read_all(_dir + "fout.shader");
|
||||
var e = shader_replace_simple(shader, vsh, fsh);
|
||||
if (e != "") noti_warning($"Error applying the shader: {e}");
|
||||
}
|
||||
}
|
||||
|
||||
static onValueUpdate = function(index) {
|
||||
refreshShader();
|
||||
}
|
||||
|
||||
static processData = function(_output, _data, _output_index, _array_index = 0) {
|
||||
var _surf = _data[2];
|
||||
_output = surface_verify(_output, surface_get_width(_surf), surface_get_height(_surf));
|
||||
|
||||
surface_set_shader(_output, shader);
|
||||
|
||||
var uTypes = array_create(8, 0);
|
||||
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];
|
||||
|
||||
var _index = uTypes[_arg_type];
|
||||
uTypes[_arg_type]++;
|
||||
var _uni_name = uniform_name + string(_index);
|
||||
|
||||
switch(_arg_type) {
|
||||
case 0 : shader_set_f(_uni_name, _arg_valu); break; //u_float
|
||||
case 1 : shader_set_i(_uni_name, _arg_valu); break; //u_int
|
||||
case 2 : shader_set_f(_uni_name, _arg_valu); break; //u_vec2
|
||||
case 3 : shader_set_f(_uni_name, _arg_valu); break; //u_vec3
|
||||
case 4 : shader_set_f(_uni_name, _arg_valu); break; //u_vec4
|
||||
case 5 : shader_set_f(_uni_name, _arg_valu); break; //u_mat3
|
||||
case 6 : shader_set_f(_uni_name, _arg_valu); break; //u_mat4
|
||||
case 7 : shader_set_surface(_uni_name, _arg_valu); break; //u_sampler2D
|
||||
}
|
||||
}
|
||||
|
||||
draw_surface_safe(_surf);
|
||||
surface_reset_shader();
|
||||
|
||||
return _output;
|
||||
}
|
||||
|
||||
static postConnect = function() {
|
||||
refreshShader();
|
||||
}
|
||||
|
||||
static onCleanUp = function() {
|
||||
custom_shader_free(self);
|
||||
}
|
||||
}
|
173
scripts/node_hlsl/node_hlsl.gml
Normal file
173
scripts/node_hlsl/node_hlsl.gml
Normal file
|
@ -0,0 +1,173 @@
|
|||
function Node_HLSL(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) constructor {
|
||||
name = "HLSL";
|
||||
shader = { vs: -1, fs: -1 };
|
||||
|
||||
inputs[| 0] = nodeValue("Vertex", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, @"")
|
||||
.setDisplay(VALUE_DISPLAY.codeHLSL)
|
||||
.rejectArray();
|
||||
|
||||
inputs[| 1] = nodeValue("Fragment", self, JUNCTION_CONNECT.input, VALUE_TYPE.text,
|
||||
@"float4 combinedColour = gm_BaseTextureObject.Sample(gm_BaseTexture, input.uv);
|
||||
return combinedColour;")
|
||||
.setDisplay(VALUE_DISPLAY.codeHLSL)
|
||||
.rejectArray();
|
||||
|
||||
inputs[| 2] = nodeValue("Base Texture", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone);
|
||||
|
||||
outputs[| 0] = nodeValue("Surface", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone );
|
||||
|
||||
static createNewInput = function() {
|
||||
var index = ds_list_size(inputs);
|
||||
inputs[| index + 0] = nodeValue("Argument name", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "" );
|
||||
|
||||
inputs[| index + 1] = nodeValue("Argument type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0 )
|
||||
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Float", "Int", "Vec2", "Vec3", "Vec4", "Mat3", "Mat4", "Sampler2D" ], { update_hover: false });
|
||||
inputs[| index + 1].editWidget.interactable = false;
|
||||
|
||||
inputs[| index + 2] = nodeValue("Argument value", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 )
|
||||
.setVisible(true, true);
|
||||
inputs[| index + 2].editWidget.interactable = false;
|
||||
}
|
||||
|
||||
argumentRenderer();
|
||||
|
||||
input_display_list = [ 2,
|
||||
["Shader", false], 1,
|
||||
["Arguments", false], argument_renderer,
|
||||
];
|
||||
|
||||
setIsDynamicInput(3);
|
||||
|
||||
insp1UpdateTooltip = __txt("Compile");
|
||||
insp1UpdateIcon = [ THEME.refresh, 1, COLORS._main_value_positive ];
|
||||
|
||||
static onInspector1Update = function() { //compile
|
||||
refreshShader();
|
||||
}
|
||||
|
||||
static refreshShader = function() {
|
||||
var vs = inputs[| 0].getValue();
|
||||
var fs = inputs[| 1].getValue();
|
||||
|
||||
var _dir = DIRECTORY + "shadertemp/";
|
||||
var vs = @"
|
||||
#define MATRIX_WORLD 0
|
||||
#define MATRIX_WORLD_VIEW 1
|
||||
#define MATRIX_WORLD_VIEW_PROJECTION 2
|
||||
|
||||
cbuffer Matrices : register(b0) {
|
||||
float4x4 gm_Matrices[3];
|
||||
};
|
||||
|
||||
struct VertexShaderInput {
|
||||
float3 pos : POSITION;
|
||||
float4 color : COLOR0;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
struct VertexShaderOutput {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
VertexShaderOutput main(VertexShaderInput input) {
|
||||
VertexShaderOutput output;
|
||||
|
||||
output.pos = mul(gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION], float4(input.pos, 1.0f));
|
||||
output.uv = input.uv;
|
||||
|
||||
return output;
|
||||
}";
|
||||
file_text_write_all(_dir + "vout.shader", vs);
|
||||
|
||||
var fs_pre = @"
|
||||
Texture2D gm_BaseTextureObject : register(t0);
|
||||
SamplerState gm_BaseTexture : register(s0);
|
||||
|
||||
struct PixelShaderInput {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
"
|
||||
var fs_param = "";
|
||||
var sampler_slot = 1;
|
||||
|
||||
for( var i = input_fix_len, n = ds_list_size(inputs); i < n; i += data_length ) {
|
||||
var _arg_name = inputs[| i + 0].getValue();
|
||||
var _arg_type = inputs[| i + 1].getValue();
|
||||
|
||||
switch(_arg_type) {
|
||||
case 0 : fs_param += $"uniform float {_arg_name};\n"; break; //u_float
|
||||
case 1 : fs_param += $"uniform int {_arg_name};\n"; break; //u_int
|
||||
case 2 : fs_param += $"uniform float2 {_arg_name};\n"; break; //u_vec2
|
||||
case 3 : fs_param += $"uniform float3 {_arg_name};\n"; break; //u_vec3
|
||||
case 4 : fs_param += $"uniform float4 {_arg_name};\n"; break; //u_vec4
|
||||
case 5 : fs_param += $"uniform float3x3 {_arg_name};\n"; break; //u_mat3
|
||||
case 6 : fs_param += $"uniform float4x4 {_arg_name};\n"; break; //u_mat4
|
||||
case 7 : //u_sampler2D
|
||||
fs_param += $"Texture2D {_arg_name}Object : register(t{sampler_slot});\nSamplerState {_arg_name} : register(s{sampler_slot});\n";
|
||||
sampler_slot++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var fs_pos = "float4 main(PixelShaderInput input) : SV_TARGET {" + fs + "}";
|
||||
|
||||
fs = fs_pre + fs_param + fs_pos;
|
||||
file_text_write_all(_dir + "fout.shader", fs);
|
||||
|
||||
shader.vs = d3d11_shader_compile_vs(_dir + "vout.shader", "main", "vs_4_0");
|
||||
if (!d3d11_shader_exists(shader.vs))
|
||||
print(d3d11_get_error_string());
|
||||
|
||||
shader.fs = d3d11_shader_compile_ps(_dir + "fout.shader", "main", "ps_4_0");
|
||||
if (!d3d11_shader_exists(shader.fs))
|
||||
print(d3d11_get_error_string());
|
||||
}
|
||||
|
||||
static onValueUpdate = function(index) {
|
||||
var _refresh = index == 0 || index == 1 || (index > input_fix_len && (index - input_fix_len) % data_length != 2);
|
||||
if(_refresh) refreshShader();
|
||||
}
|
||||
|
||||
static processData = function(_output, _data, _output_index, _array_index = 0) {
|
||||
var _surf = _data[2];
|
||||
_output = surface_verify(_output, surface_get_width(_surf), surface_get_height(_surf));
|
||||
|
||||
surface_set_target(_output);
|
||||
DRAW_CLEAR
|
||||
|
||||
d3d11_shader_override_vs(shader.vs);
|
||||
d3d11_shader_override_ps(shader.fs);
|
||||
|
||||
var uTypes = array_create(8, 0);
|
||||
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];
|
||||
|
||||
switch(_arg_type) {
|
||||
case 0 : shader_set_f(_arg_name, _arg_valu); break; //u_float
|
||||
case 1 : shader_set_i(_arg_name, _arg_valu); break; //u_int
|
||||
case 2 : shader_set_f(_arg_name, _arg_valu); break; //u_vec2
|
||||
case 3 : shader_set_f(_arg_name, _arg_valu); break; //u_vec3
|
||||
case 4 : shader_set_f(_arg_name, _arg_valu); break; //u_vec4
|
||||
case 5 : shader_set_f(_arg_name, _arg_valu); break; //u_mat3
|
||||
case 6 : shader_set_f(_arg_name, _arg_valu); break; //u_mat4
|
||||
case 7 : shader_set_surface(_arg_name, _arg_valu); break; //u_sampler2D
|
||||
}
|
||||
}
|
||||
|
||||
draw_surface_safe(_surf);
|
||||
|
||||
d3d11_shader_override_vs(-1);
|
||||
d3d11_shader_override_ps(-1);
|
||||
surface_reset_target();
|
||||
|
||||
return _output;
|
||||
}
|
||||
|
||||
static postConnect = function() {
|
||||
refreshShader();
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"resourceType": "GMScript",
|
||||
"resourceVersion": "1.0",
|
||||
"name": "node_glsl",
|
||||
"name": "node_hlsl",
|
||||
"isCompatibility": false,
|
||||
"isDnD": false,
|
||||
"parent": {
|
|
@ -651,7 +651,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor {
|
|||
addNodeObject(node, "Lua Compute", s_node_lua_compute, "Node_Lua_Compute", [1, Node_Lua_Compute]).setVersion(1090);
|
||||
|
||||
ds_list_add(node, "Shader");
|
||||
addNodeObject(node, "GLSL", s_node_lua_compute, "Node_GLSL", [1, Node_GLSL]).setVersion(11520);
|
||||
addNodeObject(node, "HLSL", s_node_lua_compute, "Node_HLSL", [1, Node_HLSL]).setVersion(11520);
|
||||
|
||||
ds_list_add(node, "Organize");
|
||||
addNodeObject(node, "Pin", s_node_pin, "Node_Pin", [1, Node_Pin],, "Craete pin to organize your connection. Can be create by double clicking on a connection line.");
|
||||
|
|
|
@ -93,7 +93,7 @@ enum VALUE_DISPLAY {
|
|||
|
||||
//Text
|
||||
codeLUA,
|
||||
codeGLSL,
|
||||
codeHLSL,
|
||||
text_array,
|
||||
text_box,
|
||||
|
||||
|
@ -497,6 +497,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
|
|||
|
||||
display_data = -1;
|
||||
display_attribute = noone;
|
||||
|
||||
popup_dialog = noone;
|
||||
#endregion
|
||||
|
||||
#region ---- graph ----
|
||||
|
@ -974,13 +976,13 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
|
|||
editWidget.min_lines = 4;
|
||||
extract_node = "Node_String";
|
||||
break;
|
||||
case VALUE_DISPLAY.codeGLSL:
|
||||
case VALUE_DISPLAY.codeHLSL:
|
||||
editWidget = new textArea(TEXTBOX_INPUT.text, function(str) {
|
||||
return setValueDirect(str);
|
||||
});
|
||||
|
||||
editWidget.font = f_code;
|
||||
editWidget.format = TEXT_AREA_FORMAT.codeGLSL;
|
||||
editWidget.format = TEXT_AREA_FORMAT.codeHLSL;
|
||||
editWidget.min_lines = 4;
|
||||
extract_node = "Node_String";
|
||||
break;
|
||||
|
|
|
@ -834,6 +834,7 @@ function PanelContent() constructor {
|
|||
expandable = true;
|
||||
resizable = true;
|
||||
|
||||
auto_pin = false;
|
||||
panel = noone;
|
||||
mx = 0;
|
||||
my = 0;
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
function Panel_Menu() : PanelContent() constructor {
|
||||
title = __txt("Menu");
|
||||
title = __txt("Menu");
|
||||
auto_pin = true;
|
||||
|
||||
noti_flash = 0;
|
||||
noti_flash = 0;
|
||||
noti_flash_color = COLORS._main_accent;
|
||||
noti_icon = noone;
|
||||
noti_icon_show = 0;
|
||||
noti_icon_time = 0;
|
||||
noti_icon = noone;
|
||||
noti_icon_show = 0;
|
||||
noti_icon_time = 0;
|
||||
|
||||
version_name_copy = 0;
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ function Panel_Text_Editor(_textArea, _inputFunc, _context) : PanelContent() con
|
|||
title = "";
|
||||
w = ui(640);
|
||||
h = ui(480);
|
||||
auto_pin = true;
|
||||
|
||||
self._textArea = new textArea(_textArea.input, _textArea.onModify);
|
||||
self._textArea.color = _textArea.color;
|
||||
|
@ -44,5 +45,6 @@ function Panel_Text_Editor(_textArea, _inputFunc, _context) : PanelContent() con
|
|||
|
||||
function onClose() {
|
||||
_textArea.apply();
|
||||
context.popup_dialog = noone;
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
enum TEXT_AREA_FORMAT {
|
||||
_default,
|
||||
codeLUA,
|
||||
codeGLSL,
|
||||
codeHLSL,
|
||||
delimiter,
|
||||
path_template,
|
||||
node_title,
|
||||
|
@ -83,7 +83,7 @@ function textArea(_input, _onModify, _extras = noone) : textInput(_input, _onMod
|
|||
} #endregion
|
||||
|
||||
static onModified = function() { #region
|
||||
if((format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeGLSL) && autocomplete_server != noone) {
|
||||
if((format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeHLSL) && autocomplete_server != noone) {
|
||||
var crop = string_copy(_input_text, 1, cursor);
|
||||
var slp = string_splice(crop, [" ", "(", ",", "\n"]);
|
||||
var pmt = array_safe_get(slp, -1,, ARRAY_OVERFLOW.loop);
|
||||
|
@ -177,7 +177,7 @@ function textArea(_input, _onModify, _extras = noone) : textInput(_input, _onMod
|
|||
}
|
||||
}
|
||||
|
||||
if(!(format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeGLSL) || !autocomplete_box.active) {
|
||||
if(!(format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeHLSL) || !autocomplete_box.active) {
|
||||
if(key == vk_up) {
|
||||
var _target;
|
||||
|
||||
|
@ -268,7 +268,7 @@ function textArea(_input, _onModify, _extras = noone) : textInput(_input, _onMod
|
|||
|
||||
var _txtLines = string_splice(_input_text, "\n");
|
||||
var ss = "";
|
||||
var _code = format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeGLSL;
|
||||
var _code = format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeHLSL;
|
||||
|
||||
for( var i = 0, n = array_length(_txtLines); i < n; i++ ) {
|
||||
var _txt = _txtLines[i] + (i < array_length(_txtLines)? "\n" : "");
|
||||
|
@ -531,7 +531,7 @@ function textArea(_input, _onModify, _extras = noone) : textInput(_input, _onMod
|
|||
draw_text_add(ch_x, ch_y, _str);
|
||||
else if(format == TEXT_AREA_FORMAT.codeLUA)
|
||||
draw_code_lua(ch_x, ch_y, _str);
|
||||
else if(format == TEXT_AREA_FORMAT.codeGLSL)
|
||||
else if(format == TEXT_AREA_FORMAT.codeHLSL)
|
||||
draw_code_glsl(ch_x, ch_y, _str);
|
||||
else if(format == TEXT_AREA_FORMAT.delimiter)
|
||||
draw_text_delimiter(ch_x, ch_y, _str);
|
||||
|
@ -584,12 +584,10 @@ function textArea(_input, _onModify, _extras = noone) : textInput(_input, _onMod
|
|||
|
||||
if(target != -999) {
|
||||
if(mouse_press(mb_left, active) || click_block == 1) {
|
||||
cursor_select = -1;
|
||||
cursor = target;
|
||||
click_block = 0;
|
||||
} else if(mouse_click(mb_left, active) && cursor != target) {
|
||||
cursor_select = target;
|
||||
}
|
||||
click_block = 0;
|
||||
} else if(mouse_click(mb_left, active) && cursor != target)
|
||||
cursor = target;
|
||||
}
|
||||
} #endregion
|
||||
|
||||
|
@ -627,7 +625,7 @@ function textArea(_input, _onModify, _extras = noone) : textInput(_input, _onMod
|
|||
|
||||
if(format == TEXT_AREA_FORMAT._default) {
|
||||
line_width = _w - ui(16);
|
||||
} else if(format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeGLSL) {
|
||||
} else if(format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeHLSL) {
|
||||
line_width = _w - ui(16 + code_line_width);
|
||||
tx += ui(code_line_width);
|
||||
}
|
||||
|
@ -642,7 +640,7 @@ function textArea(_input, _onModify, _extras = noone) : textInput(_input, _onMod
|
|||
|
||||
draw_sprite_stretched_ext(THEME.textbox, 3, _x, _y, _w, hh, boxColor, 1);
|
||||
|
||||
if(format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeGLSL) {
|
||||
if(format == TEXT_AREA_FORMAT.codeLUA || format == TEXT_AREA_FORMAT.codeHLSL) {
|
||||
draw_sprite_stretched_ext(THEME.textbox_code, 0, _x, _y, ui(code_line_width), hh, boxColor, 1);
|
||||
draw_set_text(f_code, fa_right, fa_top, COLORS._main_text_sub);
|
||||
|
||||
|
|
|
@ -272,12 +272,10 @@ function textBox(_input, _onModify, _extras = noone) : textInput(_input, _onModi
|
|||
|
||||
if(target != -999) {
|
||||
if(mouse_press(mb_left, active) || click_block == 1) {
|
||||
cursor_select = -1;
|
||||
cursor = target;
|
||||
click_block = 0;
|
||||
} else if(mouse_click(mb_left, active) && cursor != target) {
|
||||
cursor_select = target;
|
||||
}
|
||||
click_block = 0;
|
||||
} else if(mouse_click(mb_left, active) && cursor != target)
|
||||
cursor = target;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue