Skip to content

Commit

Permalink
fix errors on skybox and brick wall shaders on export
Browse files Browse the repository at this point in the history
fixed by preventing shader properties to be acessed before
ready and manually reassigning them on ready
  • Loading branch information
eh-jogos committed Nov 10, 2022
1 parent 8417904 commit 379c53d
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 42 deletions.
19 changes: 17 additions & 2 deletions stages/_base/skyboxes/skybox.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ extends Sprite2D
#--- constants ------------------------------------------------------------------------------------

const SCENE_EXTRA := preload("res://stages/_base/skyboxes/extra_texture.tscn")
const DEFAULT_TEXTURE1D = preload("res://stages/stage_01/background_elements/skyboxes/skybox_default_texture1d.tres")

#--- public variables - order: export > normal var > onready --------------------------------------

Expand Down Expand Up @@ -53,16 +54,17 @@ var _extra_textures_data: Dictionary = {}

var _tween: Tween

var _shader_gradient := material.get_shader_parameter("gradient").gradient as Gradient

var _all_clouds: Array[Sprite2D] = []

var _shader_gradient: Gradient = null

### -----------------------------------------------------------------------------------------------


### Built in Engine Methods -----------------------------------------------------------------------

func _ready() -> void:
_restore_shader_params()
item_rect_changed.connect(_resize_all_extra_nodes)

_reset_extra_nodes()
Expand Down Expand Up @@ -117,6 +119,19 @@ func stop_animations() -> void:

### Private Methods -------------------------------------------------------------------------------

## This is a hack that for some reason is needed in the exported version because of a bug where
## all values from shader parameters loaded from tscns are lost, even though when running from
## the editor everything is fine.
func _restore_shader_params() -> void:
var shader_material = (material as ShaderMaterial)
var texture_1D := DEFAULT_TEXTURE1D.duplicate(true)
shader_material.set_shader_parameter("gradient", texture_1D)
shader_material.set_shader_parameter("is_active", true)
shader_material.set_shader_parameter("show_grayscale", false)

_shader_gradient = texture_1D.gradient as Gradient


func _reset_extra_nodes() -> void:
if not is_inside_tree():
await ready
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,38 @@ extends Sprite2D

#--- constants ------------------------------------------------------------------------------------

const DEFAULT_TEXTURE1D = preload("res://stages/stage_01/background_elements/buildings/walls/brick_wall/brick_wall_default_grayscale1D.tres")
const DEFAULT_GRADIENT = preload("res://stages/stage_01/background_elements/buildings/walls/brick_wall/brick_wall_default_gradient.tres")

#--- public variables - order: export > normal var > onready --------------------------------------

@export var color_darkest: Color:
@export var color_darkest: Color = Color.BLACK:
get:
return _get_shader_gradient_color_at(0, Color.BLACK)
return _get_shader_gradient_color_at(0, color_darkest)
set(value):
_set_shader_gradient_color_at(0, value)
color_darkest = value
_set_shader_gradient_color_at(0, color_darkest)

@export var color_shadow: Color:
@export var color_shadow: Color = Color.DARK_GRAY:
get:
return _get_shader_gradient_color_at(1, Color.DARK_GRAY)
return _get_shader_gradient_color_at(1, color_shadow)
set(value):
_set_shader_gradient_color_at(1, value)
color_shadow = value
_set_shader_gradient_color_at(1, color_shadow)

@export var color_base: Color:
@export var color_base: Color = Color.LIGHT_GRAY:
get:
return _get_shader_gradient_color_at(2, Color.LIGHT_GRAY)
return _get_shader_gradient_color_at(2, color_base)
set(value):
_set_shader_gradient_color_at(2, value)
color_base = value
_set_shader_gradient_color_at(2, color_base)

@export var color_highlights: Color:
@export var color_highlights: Color = Color.WHITE:
get:
return _get_shader_gradient_color_at(3, Color.WHITE)
return _get_shader_gradient_color_at(3, color_highlights)
set(value):
_set_shader_gradient_color_at(3, value)
color_highlights = value
_set_shader_gradient_color_at(3, color_highlights)

#--- private variables - order: export > normal var > onready -------------------------------------

Expand All @@ -44,6 +51,7 @@ extends Sprite2D
### Built in Engine Methods -----------------------------------------------------------------------

func _ready() -> void:
_restore_shader_params()
pass

### -----------------------------------------------------------------------------------------------
Expand All @@ -56,20 +64,41 @@ func _ready() -> void:

### Private Methods -------------------------------------------------------------------------------

## This is a hack that for some reason is needed in the exported version because of a bug where
## all values from shader parameters loaded from tscns are lost, even though when running from
## the editor everything is fine.
func _restore_shader_params() -> void:
var shader_material = (material as ShaderMaterial)
var texture_1D := DEFAULT_TEXTURE1D.duplicate(true)
var gradient := DEFAULT_GRADIENT.duplicate(true)
texture_1D.gradient = gradient
shader_material.set_shader_parameter("gradient", texture_1D)
shader_material.set_shader_parameter("is_active", true)
shader_material.set_shader_parameter("show_grayscale", false)

var count := 0
for color in [color_darkest, color_shadow, color_base, color_highlights]:
_set_shader_gradient_color_at(count, color)
count += 1


func _get_shader_gradient_color_at(index: int, fallback_color := Color.BLACK) -> Color:
var value := fallback_color

var gradient := \
(material as ShaderMaterial).get_shader_parameter("gradient").gradient as Gradient
if gradient.get_point_count() != 4:
push_error("Brick wall's shader gradient must have 4 points.")
else:
value = gradient.get_color(index)

if is_inside_tree():
var gradient := \
(material as ShaderMaterial).get_shader_parameter("gradient").gradient as Gradient
if gradient.get_point_count() != 4:
push_error("Brick wall's shader gradient must have 4 points.")
else:
value = gradient.get_color(index)
return value


func _set_shader_gradient_color_at(index: int, value: Color) -> void:
if not is_inside_tree():
await ready

var gradient := \
(material as ShaderMaterial).get_shader_parameter("gradient").gradient as Gradient
if gradient.get_point_count() != 4:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@
[ext_resource type="Texture2D" uid="uid://bwcbufs45uo2m" path="res://stages/stage_01/background_elements/buildings/walls/brick_wall/brick_pattern_grayscale.png" id="1_jk1bf"]
[ext_resource type="Script" path="res://stages/stage_01/background_elements/buildings/walls/brick_wall/brick_wall.gd" id="3_ulpfj"]

[sub_resource type="Gradient" id="Gradient_qf2sq"]
[sub_resource type="Gradient" id="Gradient_kv5un"]
resource_local_to_scene = true
interpolation_mode = 2
offsets = PackedFloat32Array(0, 0.268817, 0.575269, 0.854839)
colors = PackedColorArray(0.0823529, 0.027451, 0.027451, 1, 0.505882, 0.137255, 0.121569, 1, 0.596078, 0.313726, 0.188235, 1, 0.745098, 0.572549, 0.411765, 1)
colors = PackedColorArray(0, 0, 0, 1, 0.662745, 0.662745, 0.662745, 1, 0.827451, 0.827451, 0.827451, 1, 1, 1, 1, 1)

[sub_resource type="GradientTexture1D" id="GradientTexture1D_wo2xc"]
[sub_resource type="GradientTexture1D" id="GradientTexture1D_wstyt"]
resource_local_to_scene = true
gradient = SubResource("Gradient_qf2sq")
gradient = SubResource("Gradient_kv5un")

[sub_resource type="ShaderMaterial" id="ShaderMaterial_6j1ne"]
resource_local_to_scene = true
shader = ExtResource("1_eics1")
shader_parameter/gradient = SubResource("GradientTexture1D_wo2xc")
shader_parameter/gradient = SubResource("GradientTexture1D_wstyt")
shader_parameter/is_active = true
shader_parameter/show_grayscale = false

Expand All @@ -28,7 +27,4 @@ texture = ExtResource("1_jk1bf")
region_enabled = true
region_rect = Rect2(0, 0, 516, 513)
script = ExtResource("3_ulpfj")
color_darkest = Color(0.0823529, 0.027451, 0.027451, 1)
color_shadow = Color(0.505882, 0.137255, 0.121569, 1)
color_base = Color(0.596078, 0.313726, 0.188235, 1)
color_highlights = Color(0.745098, 0.572549, 0.411765, 1)
color_shadow = Color(0.662745, 0.662745, 0.662745, 1)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[gd_resource type="Gradient" format=3]

[resource]
resource_local_to_scene = true
interpolation_mode = 2
offsets = PackedFloat32Array(0, 0.268817, 0.575269, 0.854839)
colors = PackedColorArray(0, 0, 0, 1, 0.662745, 0.662745, 0.662745, 1, 0.827451, 0.827451, 0.827451, 1, 1, 1, 1, 1)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[gd_resource type="GradientTexture1D" format=3 uid="uid://pbndpcmcjj3w"]

[resource]
resource_local_to_scene = true
15 changes: 5 additions & 10 deletions stages/stage_01/background_elements/skyboxes/skybox.tscn
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
[gd_scene load_steps=34 format=3 uid="uid://ca6iowcjexjvn"]
[gd_scene load_steps=33 format=3 uid="uid://ca6iowcjexjvn"]

[ext_resource type="Texture2D" uid="uid://egjhs2885c00" path="res://stages/stage_01/background_elements/skyboxes/area_1_skybox_1_0.png" id="1_f6u5w"]
[ext_resource type="Shader" path="res://stages/_base/skyboxes/gradient_map.gdshader" id="1_vpob3"]
[ext_resource type="Texture2D" uid="uid://b8qv562jj6iw5" path="res://stages/stage_01/background_elements/skyboxes/skybox_default_texture1d.tres" id="2_mjq46"]
[ext_resource type="Texture2D" uid="uid://d204xxt3ynf3w" path="res://stages/stage_01/background_elements/skyboxes/area_1_skybox_1_1.png" id="2_mvoff"]
[ext_resource type="Script" path="res://stages/_base/skyboxes/skybox.gd" id="2_tgyol"]
[ext_resource type="Texture2D" uid="uid://cagmug6l4do2d" path="res://stages/stage_01/background_elements/skyboxes/area_1_skybox_1_2.png" id="3_w15ne"]
Expand All @@ -10,17 +11,9 @@
[ext_resource type="Script" path="res://stages/_base/skyboxes/skybox_extra_texture_data.gd" id="8_eudom"]
[ext_resource type="Script" path="res://stages/_base/skyboxes/skybox_gradient_transitioner.gd" id="9_65dxk"]

[sub_resource type="Gradient" id="Gradient_qs8id"]
offsets = PackedFloat32Array(0, 0.259, 0.435, 0.656, 0.972)
colors = PackedColorArray(0, 0.0456241, 0.109756, 1, 0, 0.415686, 1, 1, 0.192556, 0.689018, 0.957944, 1, 0.42856, 0.80186, 0.972127, 1, 0.882353, 0.972549, 0.992157, 1)

[sub_resource type="GradientTexture1D" id="GradientTexture1D_fbtva"]
gradient = SubResource("Gradient_qs8id")
width = 1024

[sub_resource type="ShaderMaterial" id="ShaderMaterial_3tgxg"]
shader = ExtResource("1_vpob3")
shader_parameter/gradient = SubResource("GradientTexture1D_fbtva")
shader_parameter/gradient = ExtResource("2_mjq46")
shader_parameter/is_active = true
shader_parameter/show_grayscale = false

Expand Down Expand Up @@ -147,3 +140,5 @@ extra_textures_data = {
5981265806675957122: SubResource("Resource_3txg3"),
9107773377900830858: SubResource("Resource_yp3yx")
}

[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[gd_resource type="GradientTexture1D" load_steps=2 format=3 uid="uid://b8qv562jj6iw5"]

[sub_resource type="Gradient" id="Gradient_qs8id"]
offsets = PackedFloat32Array(0, 0.259, 0.435, 0.656, 0.972)
colors = PackedColorArray(0, 0.0456241, 0.109756, 1, 0, 0.415686, 1, 1, 0.192556, 0.689018, 0.957944, 1, 0.42856, 0.80186, 0.972127, 1, 0.882353, 0.972549, 0.992157, 1)

[resource]
gradient = SubResource("Gradient_qs8id")
width = 1024

0 comments on commit 379c53d

Please sign in to comment.