[Normal light] improvement

This commit is contained in:
Tanasart 2024-10-04 15:14:12 +07:00
parent db1af35899
commit 423b9655f3
24 changed files with 479 additions and 72 deletions

View File

@ -1620,6 +1620,7 @@
{"name":"sh_noise_strand","order":10,"path":"shaders/sh_noise_strand/sh_noise_strand.yy",},
{"name":"sh_noise_wavelet","order":11,"path":"shaders/sh_noise_wavelet/sh_noise_wavelet.yy",},
{"name":"sh_noise","order":1,"path":"shaders/sh_noise/sh_noise.yy",},
{"name":"sh_normal_light_apply","order":5,"path":"shaders/sh_normal_light_apply/sh_normal_light_apply.yy",},
{"name":"sh_normal_light","order":1,"path":"shaders/sh_normal_light/sh_normal_light.yy",},
{"name":"sh_normalize","order":23,"path":"shaders/sh_normalize/sh_normalize.yy",},
{"name":"sh_offset","order":12,"path":"shaders/sh_offset/sh_offset.yy",},
@ -2297,6 +2298,7 @@
{"name":"s_node_noise_perlin","order":11,"path":"sprites/s_node_noise_perlin/s_node_noise_perlin.yy",},
{"name":"s_node_noise_simplex","order":20,"path":"sprites/s_node_noise_simplex/s_node_noise_simplex.yy",},
{"name":"s_node_noise","order":8,"path":"sprites/s_node_noise/s_node_noise.yy",},
{"name":"s_node_normal_light_type","order":29,"path":"sprites/s_node_normal_light_type/s_node_normal_light_type.yy",},
{"name":"s_node_normal_light","order":37,"path":"sprites/s_node_normal_light/s_node_normal_light.yy",},
{"name":"s_node_normal","order":36,"path":"sprites/s_node_normal/s_node_normal.yy",},
{"name":"s_node_normalize","order":62,"path":"sprites/s_node_normalize/s_node_normalize.yy",},

View File

@ -2302,6 +2302,7 @@
{"id":{"name":"sh_noise_strand","path":"shaders/sh_noise_strand/sh_noise_strand.yy",},},
{"id":{"name":"sh_noise_wavelet","path":"shaders/sh_noise_wavelet/sh_noise_wavelet.yy",},},
{"id":{"name":"sh_noise","path":"shaders/sh_noise/sh_noise.yy",},},
{"id":{"name":"sh_normal_light_apply","path":"shaders/sh_normal_light_apply/sh_normal_light_apply.yy",},},
{"id":{"name":"sh_normal_light","path":"shaders/sh_normal_light/sh_normal_light.yy",},},
{"id":{"name":"sh_normal","path":"shaders/sh_normal/sh_normal.yy",},},
{"id":{"name":"sh_normalize","path":"shaders/sh_normalize/sh_normalize.yy",},},
@ -3035,6 +3036,7 @@
{"id":{"name":"s_node_noise_perlin","path":"sprites/s_node_noise_perlin/s_node_noise_perlin.yy",},},
{"id":{"name":"s_node_noise_simplex","path":"sprites/s_node_noise_simplex/s_node_noise_simplex.yy",},},
{"id":{"name":"s_node_noise","path":"sprites/s_node_noise/s_node_noise.yy",},},
{"id":{"name":"s_node_normal_light_type","path":"sprites/s_node_normal_light_type/s_node_normal_light_type.yy",},},
{"id":{"name":"s_node_normal_light","path":"sprites/s_node_normal_light/s_node_normal_light.yy",},},
{"id":{"name":"s_node_normal","path":"sprites/s_node_normal/s_node_normal.yy",},},
{"id":{"name":"s_node_normalize","path":"sprites/s_node_normalize/s_node_normalize.yy",},},

View File

@ -113,3 +113,13 @@ function draw_anchor_line(_index, _x, _y, _r, _a, _type = 0) {
draw_sprite_stretched(s_fx_pixel, 0, _x - _r, _y - _r, _r * 2, _r * 2);
shader_reset();
}
function draw_empty() {
var _s = surface_get_target();
if(_s == -1) return;
var _w = surface_get_width(_s);
var _h = surface_get_height(_s);
draw_sprite_stretched(s_fx_pixel, 0, 0, 0, _w, _h);
}

View File

@ -40,10 +40,10 @@
globalvar HOTKEYS, HOTKEY_CONTEXT;
LATEST_VERSION = 1_18_00;
VERSION = 1_18_00_0;
VERSION = 1_18_01_0;
SAVE_VERSION = 1_18_00_0;
VERSION_STRING = MAC? "1.18.003m" : "1.18.1.002";
BUILD_NUMBER = 1_18_00_1;
VERSION_STRING = MAC? "1.18.003m" : "1.18.1.004";
BUILD_NUMBER = 1_18_00_4;
HOTKEYS = ds_map_create();
HOTKEY_CONTEXT = ds_list_create();

View File

@ -122,7 +122,8 @@ function Node_2D_light(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
var _ind = input_fix_len + i * data_length;
var _typ = current_data[_ind + 0];
var cc = i == dynamic_input_inspecting? COLORS._main_text_accent : COLORS._main_icon;
var _col = current_data[_ind + 4];
var tc = i == dynamic_input_inspecting? COLORS._main_text_accent : COLORS._main_icon;
var hov = _hover && point_in_rectangle(_m[0], _m[1], _x0, _yy - lh / 2, _x1, _yy + lh / 2 - 1);
@ -135,7 +136,7 @@ function Node_2D_light(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
}
}
draw_sprite_ext(s_node_2d_light_shape, _typ, _x0 + ui(8), _yy, 1, 1, 0, cc);
draw_sprite_ext(s_node_2d_light_shape, _typ, _x0 + ui(8), _yy, 1, 1, 0, _col, .5 + .5 * (i == dynamic_input_inspecting));
draw_set_text(f_p2, fa_left, fa_center, tc);
draw_text_add(_x0 + ui(28), _yy, typeListStr[_typ]);
@ -163,12 +164,12 @@ function Node_2D_light(_x, _y, _group = noone) : Node_Processor(_x, _y, _group)
input_display_list = [ 0, lights_renderer ];
attribute_surface_depth();
temp_surface = [ 0, 0, 0 ];
setDynamicInput(22, false);
if(!LOADING && !APPENDING) createNewInput();
attribute_surface_depth();
temp_surface = [ 0, 0, 0 ];
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
PROCESSOR_OVERLAY_CHECK

View File

@ -5,77 +5,236 @@ function Node_Normal_Light(_x, _y, _group = noone) : Node_Processor(_x, _y, _gro
newInput(1, nodeValue_Surface("Normal map", self));
newInput(2, nodeValue_Float("Normal intensity", self, 1));
newInput(2, nodeValue_Float("Height", self, 1));
newInput(3, nodeValue_Color("Ambient", self, c_black));
newInput(4, nodeValue_Vec2("Light position", self, [ 0, 0 ]))
.setUnitRef(function(index) { return getDimension(index); });
newInput(4, nodeValue_Surface("Height map", self));
newInput(5, nodeValue_Float("Light range", self, 16));
typeList = [
new scrollItem("Point", s_node_normal_light_type, 0),
new scrollItem("Sun", s_node_normal_light_type, 1),
new scrollItem("Line", s_node_normal_light_type, 2),
new scrollItem("Spot", s_node_normal_light_type, 3),
];
typeListStr = array_create_ext(array_length(typeList), function(i) /*=>*/ {return typeList[i].name});
newInput(6, nodeValue_Float("Light intensity", self, 32));
static createNewInput = function() {
var _index = array_length(inputs);
dynamic_input_inspecting = getInputAmount();
newInput(7, nodeValue_Color("Light color", self, c_white));
newInput(_index + 0, nodeValue_Enum_Scroll("Type", self, 0, typeList));
newInput(8, nodeValue_Enum_Button("Light type", self, 0, ["Point", "Sun"]));
newInput(_index + 1, nodeValue_Vec3("Position", self, [ 0, 0, 1 ]))
.setUnitRef(function(index) /*=>*/ {return getDimension(index)});
newInput(9, nodeValue_Bool("Active", self, true));
active_index = 9;
newInput(_index + 2, nodeValue_Float("Range", self, 16));
inputs[_index + 2].overlay_text_valign = fa_bottom;
newInput(10, nodeValue_Float("Light height", self, 1));
newInput(_index + 3, nodeValue_Float("Intensity", self, 4));
input_display_list = [ 9, 0,
["Normal", false], 1, 2,
["Light", false], 3, 8, 4, 10, 5, 6, 7
newInput(_index + 4, nodeValue_Color("Color", self, c_white));
newInput(_index + 5, nodeValue_Vec3("End Position", self, [ 0, 0, 1 ]))
.setUnitRef(function(index) /*=>*/ {return getDimension(index)});
newInput(_index + 6, nodeValue_Color("End Color", self, c_white));
refreshDynamicDisplay();
return inputs[_index];
}
lights_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) {
var bs = ui(24);
var bx = _x + ui(20);
var by = _y;
if(buttonInstant(THEME.button_hide, bx, by, bs, bs, _m, _focus, _hover, "", THEME.add_16, 0, COLORS._main_value_positive) == 2) {
createNewInput();
triggerRender();
}
var amo = getInputAmount();
var lh = ui(28);
var _h = ui(12) + lh * amo;
var yy = _y + bs + ui(4);
var del_light = -1;
draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, yy, _w, _h, COLORS.node_composite_bg_blend, 1);
for(var i = 0; i < amo; i++) {
var _x0 = _x + ui(24);
var _x1 = _x + _w - ui(16);
var _yy = ui(6) + yy + i * lh + lh / 2;
var _ind = input_fix_len + i * data_length;
var _typ = current_data[_ind + 0];
var _col = current_data[_ind + 4];
var tc = i == dynamic_input_inspecting? COLORS._main_text_accent : COLORS._main_icon;
var hov = _hover && point_in_rectangle(_m[0], _m[1], _x0, _yy - lh / 2, _x1, _yy + lh / 2 - 1);
if(hov && _m[0] < _x1 - ui(32)) {
tc = COLORS._main_text;
if(mouse_press(mb_left, _focus)) {
dynamic_input_inspecting = i;
refreshDynamicDisplay();
}
}
draw_sprite_ext(s_node_normal_light_type, _typ, _x0 + ui(8), _yy, 1, 1, 0, _col, .5 + .5 * (i == dynamic_input_inspecting));
draw_set_text(f_p2, fa_left, fa_center, tc);
draw_text_add(_x0 + ui(28), _yy, typeListStr[_typ]);
if(amo > 1) {
var bs = ui(24);
var bx = _x1 - bs;
var by = _yy - bs / 2;
if(buttonInstant(THEME.button_hide, bx, by, bs, bs, _m, _focus, _hover, "", THEME.minus_16, 0, hov? COLORS._main_value_negative : COLORS._main_icon) == 2)
del_light = i;
}
}
if(del_light > -1)
deleteDynamicInput(del_light);
return ui(32) + _h;
});
input_display_dynamic = [ // 14,
0, 1, 5, 2,
3, 4, 6,
];
input_display_list = [
["Input", false], 0, 1, 3,
new Inspector_Spacer(8, true),
new Inspector_Spacer(2, false, false),
lights_renderer,
["Lights", false],
];
setDynamicInput(7, false);
if(!LOADING && !APPENDING) createNewInput();
newOutput(0, nodeValue_Output("Surface out", self, VALUE_TYPE.surface, noone));
newOutput(1, nodeValue_Output("Light only", self, VALUE_TYPE.surface, noone));
attribute_surface_depth();
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
PROCESSOR_OVERLAY_CHECK
var pos = current_data[4];
if(getInputAmount() == 0) return;
dynamic_input_inspecting = clamp(dynamic_input_inspecting, 0, getInputAmount() - 1);
var _ind = input_fix_len + dynamic_input_inspecting * data_length;
var typ = current_data[_ind + 0];
var pos = current_data[_ind + 1];
var rad = current_data[_ind + 2];
var px = _x + pos[0] * _s;
var py = _y + pos[1] * _s;
var _hov = false;
var hv = inputs[4].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); _hov |= hv;
var hv = inputs[5].drawOverlay(hover, active, px, py, _s, _mx, _my, _snx, _sny); _hov |= hv;
draw_set_color(COLORS._main_accent);
draw_set_alpha(0.5);
draw_circle_dash(px, py, rad * _s, 1, 8);
draw_set_alpha(1);
if(typ == 2 || typ == 3) {
if(typ == 2) {
var p2 = current_data[_ind + 5];
var px2 = _x + p2[0] * _s;
var py2 = _y + p2[1] * _s;
draw_set_color(COLORS._main_accent);
draw_line(px, py, px2, py2);
}
var hv = inputs[_ind + 1].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); _hov |= hv; hover &= !hv;
var hv = inputs[_ind + 2].drawOverlay(hover, active, px, py, _s, _mx, _my, _snx, _sny); _hov |= hv; hover &= !hv;
var hv = inputs[_ind + 5].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); _hov |= hv; hover &= !hv;
} else {
var hv = inputs[_ind + 1].drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny); _hov |= hv; hover &= !hv;
var hv = inputs[_ind + 2].drawOverlay(hover, active, px, py, _s, _mx, _my, _snx, _sny); _hov |= hv; hover &= !hv;
}
return _hov;
}
static processData = function(_outSurf, _data, _output_index, _array_index) {
static applyLight = function(_data, _dim, _ind, _ligSurf) {
var _map = _data[1];
var _hei = _data[2];
var _amb = _data[3];
var _hmap = _data[4];
var _light_pos = _data[ 4];
var _light_ran = _data[ 5];
var _light_int = _data[ 6];
var _light_col = _data[ 7];
var _light_typ = _data[ 8];
var _light_hei = _data[10];
var _light_typ = _data[_ind + 0];
var _light_pos = _data[_ind + 1];
var _light_ran = _data[_ind + 2];
var _light_int = _data[_ind + 3];
var _light_col = _data[_ind + 4];
var _light_ps2 = _data[_ind + 5];
var _light_cl2 = _data[_ind + 6];
var _dim = surface_get_dimension(_data[0]);
surface_set_shader(_outSurf, sh_normal_light);
surface_set_shader(_ligSurf, sh_normal_light, false, BLEND.add);
shader_set_surface("normalMap", _map);
shader_set_surface("heightMap", _hmap);
shader_set_i("useHeightMap", is_surface(_hmap));
shader_set_f("normalHeight", _hei);
shader_set_f("dimension", _dim);
shader_set_color("ambiance", _amb);
shader_set_f("lightPosition", _light_pos[0], _light_pos[1], -_light_hei / 100, _light_ran );
shader_set_color("lightColor", _light_col);
shader_set_f("lightIntensity", _light_int);
shader_set_i("lightType", _light_typ);
shader_set_f("lightPosition", _light_pos[0], _light_pos[1], -_light_pos[2] / 100, _light_ran );
shader_set_f("lightPosition2", _light_ps2[0], _light_ps2[1], -_light_ps2[2] / 100, _light_ran );
draw_surface_safe(_data[0]);
shader_set_f("lightIntensity", _light_int);
shader_set_color("lightColor", _light_col);
shader_set_color("lightColor2", _light_cl2);
draw_empty();
surface_reset_shader();
return _outSurf;
}
static processData = function(_outData, _data, _output_index, _array_index) {
var _surf = _data[0];
var _amb = _data[3];
var _dim = surface_get_dimension(_surf);
if(getInputAmount()) {
dynamic_input_inspecting = clamp(dynamic_input_inspecting, 0, getInputAmount() - 1);
var _ind = input_fix_len + dynamic_input_inspecting * data_length;
var _ltype = _data[_ind + 0];
inputs[_ind + 5].setVisible(_ltype == 2 || _ltype == 3);
inputs[_ind + 6].setVisible(_ltype == 2);
}
var _outSurf = surface_verify(_outData[0], _dim[0], _dim[1]);
var _ligSurf = surface_verify(_outData[1], _dim[0], _dim[1]);
surface_set_target(_ligSurf);
draw_clear(c_black);
surface_reset_target();
for( var i = 0; i < getInputAmount(); i++ ) {
var _ind = input_fix_len + i * data_length;
applyLight(_data, _dim, _ind, _ligSurf);
}
surface_set_shader(_outSurf, sh_normal_light_apply);
shader_set_surface("baseSurface", _surf);
shader_set_surface("lightSurface", _ligSurf);
shader_set_color("ambient", _amb);
draw_empty();
surface_reset_shader();
return [ _outSurf, _ligSurf ];
}
}

View File

@ -569,19 +569,27 @@ function nodeValueUnit(_nodeValue) constructor {
];
}
var _len = array_length(value);
switch(disp) {
case VALUE_DISPLAY.padding :
case VALUE_DISPLAY.vector :
case VALUE_DISPLAY.vector_range :
var _val = array_create(array_length(value));
var _val = array_clone(_len, 1);
for( var i = 0, n = array_length(value); i < n; i++ )
if(_len % 2 == 0) {
for( var i = 0, n = _len; i < n; i++ )
_val[i] = is_real(value[i])? value[i] * base[i % 2] : value[i];
} else if(_len > 2) {
_val[0] = is_real(value[0])? value[0] * base[0] : value[0];
_val[1] = is_real(value[1])? value[1] * base[1] : value[1];
}
return _val;
case VALUE_DISPLAY.area :
var _val = array_create(array_length(value));
var _val = array_create(_len);
for( var i = 0; i < 4; i++ )
_val[i] = is_real(value[i])? value[i] * base[i % 2] : value[i];

View File

@ -1,49 +1,79 @@
//
// Simple passthrough fragment shader
//
#define TAU 6.28318530718
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
#define pi1 3.14159
#define pi2 1.57079
uniform vec2 dimension;
uniform sampler2D normalMap;
uniform sampler2D heightMap;
uniform int useHeightMap;
uniform float normalHeight;
uniform vec4 ambiance;
uniform int lightType;
uniform vec4 lightPosition;
uniform vec4 lightColor;
uniform vec4 lightPosition2;
uniform float lightIntensity;
uniform vec4 lightColor;
uniform vec4 lightColor2;
uniform float spotRadius;
vec3 closestPointOnLine(vec3 P, vec3 A, vec3 B, out float t) {
vec3 AP = P - A;
vec3 AB = B - A;
t = dot(AP, AB) / dot(AB, AB);
t = clamp(t, 0.0, 1.0);
return A + t * AB;
}
void main() {
vec4 base_color = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
vec3 normal = normalize(texture2D( normalMap, v_vTexcoord ).rgb * -2.0 + 1.0) * normalHeight;
float aspect = dimension.x / dimension.y;
vec3 normal = texture2D( normalMap, v_vTexcoord ).rgb * -2.0 + 1.0;
normal = normalize(normal);
vec3 result = ambiance.rgb * base_color.rgb;
vec3 hsamp = texture2D( heightMap, v_vTexcoord ).rgb;
float h = useHeightMap == 1? (hsamp.r + hsamp.g + hsamp.b) / 3. * normalHeight : 0.;
vec3 lightPos = vec3(lightPosition.x / dimension.x, lightPosition.y / dimension.y, lightPosition.z);
float attenuation = lightIntensity;
float range = lightPosition.a / max(dimension.x, dimension.y);
vec3 curr = vec3(v_vTexcoord.x, v_vTexcoord.y, h);
vec3 lightDir;
vec3 diffuse;
vec4 lightClr = lightColor;
if(lightType == 0) {
attenuation *= max(1. - sqrt( pow(v_vTexcoord.x - lightPos.x, 2.) + pow((v_vTexcoord.y - lightPos.y) / aspect, 2.)) / range, 0.);
lightDir = normalize(lightPos - vec3(v_vTexcoord.x, v_vTexcoord.y, 0.));
} else {
vec3 lig = lightPos - curr;
lightDir = normalize(lig);
attenuation *= 1. - length(lig) / range;
} else if(lightType == 1) {
lightDir = normalize(lightPos - vec3(0.5, 0.5, 0.));
} else if(lightType == 2) {
float t = 0.;
vec3 lightPos2 = vec3(lightPosition2.x / dimension.x, lightPosition2.y / dimension.y, lightPosition2.z);
vec3 lightPosC = closestPointOnLine(curr, lightPos, lightPos2, t);
vec3 lig = lightPosC - curr;
lightDir = normalize(lig);
attenuation *= 1. - length(lig) / range;
lightClr = mix(lightColor, lightColor2, t);
} else if(lightType == 3) {
vec3 lightPos2 = vec3(lightPosition2.x / dimension.x, lightPosition2.y / dimension.y, lightPosition2.z);
vec3 spotDir = normalize(lightPos - lightPos2);
vec3 lig = lightPos - curr;
lightDir = normalize(lig);
attenuation *= 1. - acos(dot(spotDir, lightDir)) / range;
}
float d = max(dot(normal, lightDir), 0.0);
vec3 diffuse = d * lightColor.rgb * lightColor.a * base_color.rgb * attenuation;
result += diffuse;
result.r = min(result.r, base_color.r);
result.g = min(result.g, base_color.g);
result.b = min(result.b, base_color.b);
gl_FragColor = vec4(result, base_color.a);
diffuse = d * lightClr.rgb * lightClr.a * attenuation;
gl_FragColor = vec4(diffuse, 1.);
}

View File

@ -0,0 +1,11 @@
{
"type": 1,
"parent": {
"name": "shader",
"path": "folders/shader.yy",
},
"resourceVersion": "1.0",
"name": "sh_bw",
"tags": [],
"resourceType": "GMShader",
}

View File

@ -0,0 +1,11 @@
{
"type": 1,
"parent": {
"name": "shader",
"path": "folders/shader.yy",
},
"resourceVersion": "1.0",
"name": "sh_color_adjust",
"tags": [],
"resourceType": "GMShader",
}

View File

@ -0,0 +1,11 @@
{
"type": 1,
"parent": {
"name": "shader",
"path": "folders/shader.yy",
},
"resourceVersion": "1.0",
"name": "sh_color_replace",
"tags": [],
"resourceType": "GMShader",
}

View File

@ -0,0 +1,11 @@
{
"type": 1,
"parent": {
"name": "shader",
"path": "folders/shader.yy",
},
"resourceVersion": "1.0",
"name": "sh_greyscale",
"tags": [],
"resourceType": "GMShader",
}

View File

@ -0,0 +1,14 @@
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform sampler2D baseSurface;
uniform sampler2D lightSurface;
uniform vec4 ambient;
void main() {
vec4 baseColor = texture2D( baseSurface, v_vTexcoord );
vec4 lighColor = texture2D( lightSurface, v_vTexcoord );
vec4 res = baseColor * ambient + lighColor;
gl_FragColor = res;
}

View File

@ -0,0 +1,18 @@
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main() {
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_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}

View File

@ -0,0 +1,12 @@
{
"$GMShader":"",
"%Name":"sh_normal_light_apply",
"name":"sh_normal_light_apply",
"parent":{
"name":"2d effect",
"path":"folders/shader/3d/2d effect.yy",
},
"resourceType":"GMShader",
"resourceVersion":"2.0",
"type":1,
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

View File

@ -0,0 +1,107 @@
{
"$GMSprite":"",
"%Name":"s_node_normal_light_type",
"bboxMode":0,
"bbox_bottom":21,
"bbox_left":0,
"bbox_right":22,
"bbox_top":0,
"collisionKind":1,
"collisionTolerance":0,
"ConfigValues":{
"Steam":{
"textureGroupId":"{ \"name\":\"Default\", \"path\":\"texturegroups/Default\" }",
},
},
"DynamicTexturePage":false,
"edgeFiltering":false,
"For3D":false,
"frames":[
{"$GMSpriteFrame":"","%Name":"8eeba671-1e0c-4784-aee5-d2ba5a939abc","name":"8eeba671-1e0c-4784-aee5-d2ba5a939abc","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
{"$GMSpriteFrame":"","%Name":"ec86a74a-6ffe-42f5-ae93-d0d9987c648a","name":"ec86a74a-6ffe-42f5-ae93-d0d9987c648a","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
{"$GMSpriteFrame":"","%Name":"7bb75978-c213-4d25-bea3-0e87b31fe941","name":"7bb75978-c213-4d25-bea3-0e87b31fe941","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
{"$GMSpriteFrame":"","%Name":"802a0b23-160b-4c57-8816-8a04999630c9","name":"802a0b23-160b-4c57-8816-8a04999630c9","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
],
"gridX":0,
"gridY":0,
"height":24,
"HTile":false,
"layers":[
{"$GMImageLayer":"","%Name":"da039720-b10e-4f3e-a236-4f2b7fd5c6cc","blendMode":0,"displayName":"default","isLocked":false,"name":"da039720-b10e-4f3e-a236-4f2b7fd5c6cc","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,},
],
"name":"s_node_normal_light_type",
"nineSlice":null,
"origin":4,
"parent":{
"name":"nodes",
"path":"folders/sprites/nodes.yy",
},
"preMultiplyAlpha":false,
"resourceType":"GMSprite",
"resourceVersion":"2.0",
"sequence":{
"$GMSequence":"",
"%Name":"s_node_normal_light_type",
"autoRecord":true,
"backdropHeight":768,
"backdropImageOpacity":0.5,
"backdropImagePath":"",
"backdropWidth":1366,
"backdropXOffset":0.0,
"backdropYOffset":0.0,
"events":{
"$KeyframeStore<MessageEventKeyframe>":"",
"Keyframes":[],
"resourceType":"KeyframeStore<MessageEventKeyframe>",
"resourceVersion":"2.0",
},
"eventStubScript":null,
"eventToFunction":{},
"length":4.0,
"lockOrigin":false,
"moments":{
"$KeyframeStore<MomentsEventKeyframe>":"",
"Keyframes":[],
"resourceType":"KeyframeStore<MomentsEventKeyframe>",
"resourceVersion":"2.0",
},
"name":"s_node_normal_light_type",
"playback":1,
"playbackSpeed":30.0,
"playbackSpeedType":0,
"resourceType":"GMSequence",
"resourceVersion":"2.0",
"showBackdrop":true,
"showBackdropImage":false,
"timeUnits":1,
"tracks":[
{"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore<SpriteFrameKeyframe>":"","Keyframes":[
{"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
"0":{"$SpriteFrameKeyframe":"","Id":{"name":"8eeba671-1e0c-4784-aee5-d2ba5a939abc","path":"sprites/s_node_normal_light_type/s_node_normal_light_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
},"Disabled":false,"id":"321d1771-047b-45ac-96f8-fcd8dcf771d7","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"2.0","Stretch":false,},
{"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
"0":{"$SpriteFrameKeyframe":"","Id":{"name":"ec86a74a-6ffe-42f5-ae93-d0d9987c648a","path":"sprites/s_node_normal_light_type/s_node_normal_light_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
},"Disabled":false,"id":"fab4aad8-ec80-47bd-b0d2-3cc2dc70e7d1","IsCreationKey":false,"Key":1.0,"Length":1.0,"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"2.0","Stretch":false,},
{"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
"0":{"$SpriteFrameKeyframe":"","Id":{"name":"7bb75978-c213-4d25-bea3-0e87b31fe941","path":"sprites/s_node_normal_light_type/s_node_normal_light_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
},"Disabled":false,"id":"c9e919e1-db42-4300-ada7-9b3afad894ad","IsCreationKey":false,"Key":2.0,"Length":1.0,"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"2.0","Stretch":false,},
{"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
"0":{"$SpriteFrameKeyframe":"","Id":{"name":"802a0b23-160b-4c57-8816-8a04999630c9","path":"sprites/s_node_normal_light_type/s_node_normal_light_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
},"Disabled":false,"id":"0d69897c-d9c2-42c7-b9ce-382f31701120","IsCreationKey":false,"Key":3.0,"Length":1.0,"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"2.0","Stretch":false,},
],"resourceType":"KeyframeStore<SpriteFrameKeyframe>","resourceVersion":"2.0",},"modifiers":[],"name":"frames","resourceType":"GMSpriteFramesTrack","resourceVersion":"2.0","spriteId":null,"trackColour":0,"tracks":[],"traits":0,},
],
"visibleRange":null,
"volume":1.0,
"xorigin":12,
"yorigin":12,
},
"swatchColours":null,
"swfPrecision":2.525,
"textureGroupId":{
"name":"Default",
"path":"texturegroups/Default",
},
"type":0,
"VTile":false,
"width":24,
}