|
| 1 | +@tool |
| 2 | +class_name DialogicRichTextTransitionEffect |
| 3 | +extends RichTextEffect |
| 4 | + |
| 5 | +var visible_characters := -1 |
| 6 | + |
| 7 | +@export var bbcode := "animate_in" |
| 8 | +var cache := [] |
| 9 | + |
| 10 | +@export_range(0.0, 5.0, 0.01) var time := 0.2 |
| 11 | +@export_group("Color", "color") |
| 12 | +@export var color_modulate: Gradient = null |
| 13 | +@export var color_replace: Gradient = null |
| 14 | +@export_group("Scale", "scale") |
| 15 | +@export var scale_enabled := false |
| 16 | +@export var scale_curve := Curve.new() |
| 17 | +@export var scale_pivot := Vector2() |
| 18 | +@export_group("Position", "position") |
| 19 | +@export var position_enabled := false |
| 20 | +@export var position_x_curve := Curve.new() |
| 21 | +@export var position_y_curve := Curve.new() |
| 22 | + |
| 23 | +@export_group("Test", "test") |
| 24 | +@export_range(-0.1, 1.0, 0.1) var test_value := -0.1 |
| 25 | + |
| 26 | +var was_skipped := false |
| 27 | +var was_reset := false |
| 28 | + |
| 29 | + |
| 30 | +func reset() -> void: |
| 31 | + was_reset = true |
| 32 | + was_skipped = false |
| 33 | + cache.clear() |
| 34 | + |
| 35 | + |
| 36 | +func skip() -> void: |
| 37 | + was_skipped = true |
| 38 | + |
| 39 | + |
| 40 | +func _process_custom_fx(char_fx: CharFXTransform) -> bool: |
| 41 | + var char_age :float = 0.0 |
| 42 | + if test_value >= 0: |
| 43 | + char_age = test_value |
| 44 | + |
| 45 | + else: |
| 46 | + if visible_characters == 0: |
| 47 | + cache.clear() |
| 48 | + return false |
| 49 | + if was_reset: |
| 50 | + if visible_characters != -1: |
| 51 | + was_reset = false |
| 52 | + else: |
| 53 | + return false |
| 54 | + |
| 55 | + if len(cache) < visible_characters or visible_characters == -1 or was_skipped: |
| 56 | + if char_fx.range.x >= len(cache): |
| 57 | + cache.append(char_fx.elapsed_time) |
| 58 | + |
| 59 | + if was_skipped: |
| 60 | + for i in range(len(cache)): |
| 61 | + cache[i] = char_fx.elapsed_time-time |
| 62 | + |
| 63 | + if len(cache) > char_fx.range.x: |
| 64 | + char_age = char_fx.elapsed_time - cache[char_fx.range.x] |
| 65 | + |
| 66 | + var text_server := TextServerManager.get_primary_interface() |
| 67 | + var trans: float = clamp(char_age, 0.0, time)/time |
| 68 | + |
| 69 | + if color_replace: |
| 70 | + var c := color_replace.sample(trans) |
| 71 | + c.a = 1 |
| 72 | + char_fx.color = char_fx.color.lerp(c, color_replace.sample(trans).a) |
| 73 | + if color_modulate: |
| 74 | + char_fx.color *= color_modulate.sample(trans) |
| 75 | + if char_fx.font.is_valid(): |
| 76 | + var glyph_size := text_server.font_get_glyph_size(char_fx.font, Vector2i(16,1), char_fx.glyph_index) |
| 77 | + if scale_enabled: |
| 78 | + char_fx.transform = char_fx.transform.translated_local(scale_pivot*glyph_size*Vector2(1, -1)*(1-scale_curve.sample(trans))) |
| 79 | + char_fx.transform = char_fx.transform.scaled_local(Vector2.ONE*scale_curve.sample(trans)) |
| 80 | + |
| 81 | + if position_enabled: |
| 82 | + char_fx.transform = char_fx.transform.translated_local(Vector2(position_x_curve.sample(trans), position_y_curve.sample(trans))*glyph_size) |
| 83 | + |
| 84 | + return true |
0 commit comments