Add initial painting

This commit is contained in:
astra137 2025-10-05 20:14:53 -07:00
parent f740d83dcc
commit 515cc3e0fb
17 changed files with 514 additions and 3 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=19 format=3 uid="uid://dt4nq0nkmjiit"]
[gd_scene load_steps=20 format=3 uid="uid://dt4nq0nkmjiit"]
[ext_resource type="Script" uid="uid://b5tcsve1oo5ht" path="res://game_manager.gd" id="1_ig7tw"]
[ext_resource type="Texture2D" uid="uid://cvqsf1nlfqwpr" path="res://assets/background/background.png" id="1_lquwl"]
@ -9,7 +9,8 @@
[ext_resource type="PackedScene" uid="uid://c1acpop6amvcl" path="res://audience_manager.tscn" id="6_272bh"]
[ext_resource type="PackedScene" uid="uid://b8key4hjaldui" path="res://turn_manager.tscn" id="7_272bh"]
[ext_resource type="Texture2D" uid="uid://d2142cf22t1lv" path="res://assets/buttons/button1.png" id="9_2cqfq"]
[ext_resource type="Script" uid="uid://bg1vk1o2eq3fg" path="res://bark_buttons.gd" id="9_yaehf"]
[ext_resource type="PackedScene" uid="uid://donkfeu1x888o" path="res://paintings/painting.tscn" id="9_kek77"]
[ext_resource type="Script" path="res://bark_buttons.gd" id="9_yaehf"]
[ext_resource type="Texture2D" uid="uid://ut655l8y8xmi" path="res://assets/buttons/button1pressed.png" id="10_yaehf"]
[ext_resource type="Texture2D" uid="uid://c0iad21xtnjdd" path="res://assets/buttons/button3.png" id="11_074og"]
[ext_resource type="Texture2D" uid="uid://dx4dadmb37khl" path="res://assets/buttons/button3pressed.png" id="12_cegan"]
@ -22,7 +23,7 @@
default_font = ExtResource("2_5vw27")
default_font_size = 12
[node name="Node2D" type="Node2D"]
[node name="Main" type="Node"]
[node name="Background" type="Sprite2D" parent="."]
position = Vector2(640, 360)
@ -38,6 +39,9 @@ texture = ExtResource("2_7mycd")
position = Vector2(640, 360)
texture = ExtResource("3_272bh")
[node name="Painting" parent="." instance=ExtResource("9_kek77")]
position = Vector2(1075, 130)
[node name="GameManager" type="Node2D" parent="." node_paths=PackedStringArray("audience_manager", "desk", "turn_manager", "current_bid_display")]
script = ExtResource("1_ig7tw")
audience_manager = NodePath("../AudienceManager")

21
paintings/.clang-format Normal file
View file

@ -0,0 +1,21 @@
BasedOnStyle: LLVM
AlignAfterOpenBracket: DontAlign
AlignOperands: DontAlign
AlignTrailingComments:
# Kind: Never
# OverEmptyLines: 0
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortFunctionsOnASingleLine: Inline
BreakConstructorInitializers: AfterColon
ColumnLimit: 0
ContinuationIndentWidth: 8
IndentCaseLabels: true
IndentWidth: 4
InsertBraces: true
KeepEmptyLinesAtTheStartOfBlocks: false
RemoveSemicolon: true
SpacesInLineCommentPrefix:
# Minimum: 0 # We want a minimum of 1 for comments, but allow 0 for disabled code.
# Maximum: -1
TabWidth: 4
UseTab: Always

67
paintings/fractal.gd Normal file
View file

@ -0,0 +1,67 @@
@tool
extends ColorRect
@export_tool_button('Randomize', 'RandomNumberGenerator') var randomize_action = randomize
@export var smoothing := true:
set(x): material.set_shader_parameter('smoothing', x)
get(): return material.get_shader_parameter('smoothing')
@export var use_color_gradient := false:
set(x): material.set_shader_parameter('use_color_gradient', x)
get(): return material.get_shader_parameter('use_color_gradient')
@export var gradient_start := Color(.18, 0, .45):
set(x): material.set_shader_parameter('gradient_start', x)
get(): return material.get_shader_parameter('gradient_start')
@export var gradient_end := Color.YELLOW:
set(x): material.set_shader_parameter('gradient_end', x)
get(): return material.get_shader_parameter('gradient_end')
@export var gradient_accent := Color.YELLOW:
set(x): material.set_shader_parameter('gradient_accent', x)
get(): return material.get_shader_parameter('gradient_accent')
@export var fractal_scale := 0.5:
set(x): material.set_shader_parameter('scale', x)
get(): return material.get_shader_parameter('scale')
@export var fractal_seed := Vector2(-0.529, 0.136):
set(x): material.set_shader_parameter('seed', x)
get(): return material.get_shader_parameter('seed')
@export var fractal_power := 3:
set(x): material.set_shader_parameter('power', x)
get(): return material.get_shader_parameter('power')
@export var fractal_escape := 1.0:
set(x): material.set_shader_parameter('escape', x)
get(): return material.get_shader_parameter('escape')
func _on_resized() -> void:
material.set_shader_parameter('aspect_ratio', size.aspect())
func _ready() -> void:
_on_resized()
func randomize(rng_seed := randi()) -> void:
var rng := RandomNumberGenerator.new()
rng.seed = rng_seed
fractal_power = rng.randi_range(2, 5)
fractal_escape = rng.randi_range(1, 4)
#fractal_scale = randf_range(0.5, 0.5 * size.aspect()) - 0.1
match fractal_power:
5: fractal_seed = Vector2(rng.randf_range(-0.7, -0.6), rng.randf_range(-0.1, 0.1))
4: fractal_seed = Vector2(rng.randf_range(-1.2, -1), rng.randf_range(-0.2, 0.2))
3: fractal_seed = Vector2(rng.randf_range(0.45, 0.7), rng.randf_range(-0.7, 0.7))
2: match fractal_escape:
1.0: fractal_seed = Vector2(rng.randf_range(-0.9, -0.8), rng.randf_range(0, 0))
2.0: fractal_seed = Vector2(rng.randf_range(-1.8, -1.), rng.randf_range(0, 0))
_: fractal_seed = Vector2.RIGHT.rotated(randf_range(0, TAU)) * Vector2(0.6, 1)
_: fractal_seed = Vector2(rng.randf_range(-1, 1), rng.randf_range(-1, 1))

1
paintings/fractal.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://bnmc3t0wxeayv

148
paintings/fractal.gdshader Normal file
View file

@ -0,0 +1,148 @@
// Original code is MIT licensed by Cory Petkovsek
// https://github.com/TokisanGames/godot-fractal-art
shader_type canvas_item;
uniform bool smoothing = true;
uniform bool use_color_gradient = false;
uniform vec4 gradient_start : source_color = vec4(0.18, 0., 0.45, 1.);
uniform vec4 gradient_end : source_color = vec4(1., 1., 0., 1.);
uniform vec4 gradient_accent : source_color = vec4(1., 1., 0., 1.);
uniform float accent_position = 0.65;
uniform float accent_width = 0.34;
uniform float red_frequency = 1.6615;
uniform float green_frequency = 1.246;
uniform float blue_frequency = 0.831;
uniform float red_phase = 6.3;
uniform float green_phase = 6.3;
uniform float blue_phase = 6.3;
uniform highp float scale = 0.5;
uniform highp vec2 position = vec2(0, 0);
uniform float aspect_ratio = 1.33333;
uniform highp vec2 seed = vec2(-0.794084, 0.136444);
uniform int power = 2;
uniform float iterations = 50.0;
uniform float escape = 4.0;
// Convert from rectangular to polar
highp vec2 c_pol(highp vec2 c) {
highp float radius = length(c);
highp float theta = atan(c.y, c.x);
return vec2(radius, theta);
}
// Convert from rectangular to Polar
highp vec2 c_rec(highp vec2 c) {
highp float radius = abs(c.x);
highp float theta = c.y;
highp float a = radius * cos(theta);
highp float b = radius * sin(theta);
return vec2(a, b);
}
// Calculate base ^ exponent
highp vec2 c_pow(highp vec2 base, highp float ex) {
highp vec2 b = c_pol(base);
return c_rec(vec2(pow(b.x, ex), b.y * ex));
}
vec4 alpha_blend(vec4 top, vec4 bot) {
return vec4(top.r * top.a + bot.r * bot.a * (1. - top.a),
top.g * top.a + bot.g * bot.a * (1. - top.a),
top.b * top.a + bot.b * bot.a * (1. - top.a),
1.0);
}
vec4 getColor(float i) {
if (use_color_gradient) {
// Create gradient
vec4 ramp = mix(gradient_start, gradient_end, i);
// gaussian formula ae^( -(x-b)^2 / 2c^2 )
// a = curve's peak = 1.0
// b = center of peak position
// c = standard deviation which controls width of bell
float gaussianx = exp(-((i - accent_position) * (i - accent_position)) / (2. * accent_width * accent_width));
vec4 accent = vec4(gradient_accent.r * gaussianx,
gradient_accent.g * gaussianx,
gradient_accent.b * gaussianx,
gaussianx);
return alpha_blend(accent, ramp);
} else {
/* Sin/Cos creates a smooth wave between 1 and -1, offset from each other.
* You can have 4 evenly distributed offsets from sin, cos, -sin, -cos
* (sin(x) +1) / 2 -> changes the wave to go between 0 and 1 with the same frequency, +2../4 will go from 0.5 and 1.0
* Calculate full cycles with: sin(cycles*6.5*i) or (sin(cycles*5.4*i)+1.0)/2.0 or (cos(cycles*3.8*i)+1.0)/2.0
*/
return vec4((sin(red_frequency * 6.5 * i + red_phase) + 1.0) / 2.0,
(sin(green_frequency * 6.5 * i + green_phase) + 1.0) / 2.0,
(sin(blue_frequency * 6.5 * i + blue_phase) + 1.0) / 2.0,
1.);
}
}
vec2 random(vec2 uv) {
return vec2(fract(sin(dot(uv.xy,
vec2(12.9898,78.233))) * 43758.5453123));
}
vec2 voronoi(vec2 uv, float columns, float rows) {
vec2 index_uv = floor(vec2(uv.x * columns, uv.y * rows));
vec2 fract_uv = fract(vec2(uv.x * columns, uv.y * rows));
float minimum_dist = 1.0;
vec2 minimum_point;
for (int y= -1; y <= 1; y++) {
for (int x= -1; x <= 1; x++) {
vec2 neighbor = vec2(float(x),float(y));
vec2 point = random(index_uv + neighbor);
vec2 diff = neighbor + point - fract_uv;
float dist = length(diff);
if(dist < minimum_dist) {
minimum_dist = dist;
minimum_point = point;
}
}
}
return minimum_point;
}
void fragment() {
float i = 0.0;
highp vec2 c = seed;
highp vec2 z;
z.x = aspect_ratio * (UV.x - 0.5) / scale - position.x;
z.y = (UV.y - 0.5) / scale + position.y;
if (power == 2) {
while (i < iterations && length(z) <= escape) {
z = vec2(z.x * z.x - z.y * z.y, 2.0 * z.x * z.y) + c; // 20fps
i++;
}
} else {
while (i < iterations && length(z) <= escape) {
z = c_pow(z, float(power)) + c; // 6-7fps
i++;
}
}
if (i >= iterations) {
float r = voronoi(UV + seed, 10.0, 5.0).r;
COLOR = getColor(r);
} else {
if (smoothing && power > 1) {
i -= log(log(length(z))) / log(float(power));
}
COLOR = getColor(i / iterations);
}
}

View file

@ -0,0 +1 @@
uid://b8yiyjkjgvful

41
paintings/fractal.tscn Normal file
View file

@ -0,0 +1,41 @@
[gd_scene load_steps=4 format=3 uid="uid://bx4upo2n66wke"]
[ext_resource type="Shader" uid="uid://b8yiyjkjgvful" path="res://paintings/fractal.gdshader" id="1_4re67"]
[ext_resource type="Script" uid="uid://bnmc3t0wxeayv" path="res://paintings/fractal.gd" id="2_o3htp"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_o3htp"]
resource_local_to_scene = true
shader = ExtResource("1_4re67")
shader_parameter/smoothing = false
shader_parameter/use_color_gradient = false
shader_parameter/gradient_start = Color(0.18, 0, 0.45, 1)
shader_parameter/gradient_end = Color(1, 1, 0, 1)
shader_parameter/gradient_accent = Color(1, 1, 0, 1)
shader_parameter/accent_position = 0.65
shader_parameter/accent_width = 0.34
shader_parameter/red_frequency = 1.6615
shader_parameter/green_frequency = 1.246
shader_parameter/blue_frequency = 0.831
shader_parameter/red_phase = 6.3
shader_parameter/green_phase = 6.3
shader_parameter/blue_phase = 6.3
shader_parameter/scale = 0.5
shader_parameter/position = Vector2(0, 0)
shader_parameter/aspect_ratio = 1.3333334
shader_parameter/seed = Vector2(0.17868738, -0.9546245)
shader_parameter/power = 2
shader_parameter/iterations = 10.0
shader_parameter/escape = 3.0
[node name="Fractal" type="ColorRect"]
material = SubResource("ShaderMaterial_o3htp")
custom_minimum_size = Vector2(32, 24)
offset_right = 320.0
offset_bottom = 240.0
script = ExtResource("2_o3htp")
smoothing = false
fractal_seed = Vector2(0.17868738, -0.9546245)
fractal_power = 2
fractal_escape = 3.0
[connection signal="resized" from="." to="." method="_on_resized"]

BIN
paintings/frame.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b142kv367vbw7"
path="res://.godot/imported/frame.png-e1682da613f441ce461363027e19aee4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://paintings/frame.png"
dest_files=["res://.godot/imported/frame.png-e1682da613f441ce461363027e19aee4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

80
paintings/noise.gd Normal file
View file

@ -0,0 +1,80 @@
@tool
extends ColorRect
@export_tool_button('Randomize', 'RandomNumberGenerator') var randomize_action = randomize
@export var noise: FastNoiseLite:
set(x):
if noise: noise.changed.disconnect(_changed_noise)
noise = x
if noise: noise.changed.connect(_changed_noise)
@export var steps := 12:
set(x): material.set_shader_parameter('steps', x)
get(): return material.get_shader_parameter('steps')
@export var gradient_start := Color(.18, 0, .45):
set(x): material.set_shader_parameter('gradient_start', x)
get(): return material.get_shader_parameter('gradient_start')
@export var gradient_end := Color.YELLOW:
set(x): material.set_shader_parameter('gradient_end', x)
get(): return material.get_shader_parameter('gradient_end')
@export var rng_seed := 0:
set(x):
rng_seed = x
_regenerate()
var _noise_texture := NoiseTexture2D.new():
set(x):
_noise_texture = x
_changed_noise()
func _changed_noise() -> void:
_noise_texture.noise = noise
material.set_shader_parameter('noise', _noise_texture)
func _resized() -> void:
_noise_texture.width = ceili(size.x)
_noise_texture.height = ceili(size.y)
_changed_noise()
func _ready() -> void:
_resized()
resized.connect(_resized)
func _regenerate() -> void:
var rng := RandomNumberGenerator.new()
rng.seed = rng_seed
noise.fractal_type = rng.randi_range(0, 3) as FastNoiseLite.FractalType
match noise.fractal_type:
3: noise.fractal_octaves = 2
2: noise.fractal_octaves = 3
_: noise.fractal_octaves = 5
noise.frequency = rng.randf_range(0.002, 0.004)
noise.seed = rng.seed
match rng.randi_range(1, 5):
1: steps = 2
2: steps = 5
3: steps = 12
4: steps = 24
5: steps = 128
var lighter := rng.randf_range(0.4, 0.8)
var darker := rng.randf_range(0.2, 0.6)
var color1 := Color.from_ok_hsl(rng.randf(), rng.randf() * 0.8 + 0.2, lighter)
var color2 := Color.from_ok_hsl(rng.randf(), rng.randf(), lighter - darker)
match rng.randi_range(1, 2):
1: gradient_start = color1; gradient_end = color2
_: gradient_start = color2; gradient_end = color1
func randomize() -> void:
rng_seed = randi()

1
paintings/noise.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://2jt34o1v7gbo

11
paintings/noise.gdshader Normal file
View file

@ -0,0 +1,11 @@
shader_type canvas_item;
uniform sampler2D noise;
uniform float steps = 8.0;
uniform vec4 gradient_start : source_color = vec4(0.18, 0., 0.45, 1.);
uniform vec4 gradient_end : source_color = vec4(1., 1., 0., 1.);
void fragment() {
float r = round(texture(noise, UV).r * steps) / steps;
COLOR = mix(gradient_start, gradient_end, r);
}

View file

@ -0,0 +1 @@
uid://b6jkek1qotcnf

35
paintings/noise.tscn Normal file
View file

@ -0,0 +1,35 @@
[gd_scene load_steps=6 format=3 uid="uid://bjpharjtpysre"]
[ext_resource type="Shader" uid="uid://b6jkek1qotcnf" path="res://paintings/noise.gdshader" id="1_2lnyf"]
[ext_resource type="Script" uid="uid://2jt34o1v7gbo" path="res://paintings/noise.gd" id="1_o4civ"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_o4civ"]
resource_local_to_scene = true
seed = 1
frequency = 0.0028707401
offset = Vector3(1460.7504, 943.2602, 0)
fractal_type = 2
fractal_octaves = 3
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_2lnyf"]
width = 320
height = 240
noise = SubResource("FastNoiseLite_o4civ")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_0uljq"]
shader = ExtResource("1_2lnyf")
shader_parameter/noise = SubResource("NoiseTexture2D_2lnyf")
shader_parameter/steps = 8.0
shader_parameter/gradient_start = Color(0.56780183, 0.45513594, 0.630845, 1)
shader_parameter/gradient_end = Color(0.5222837, 0.45749915, 0.35617962, 1)
[node name="Noise" type="ColorRect"]
material = SubResource("ShaderMaterial_0uljq")
custom_minimum_size = Vector2(32, 24)
offset_right = 320.0
offset_bottom = 240.0
script = ExtResource("1_o4civ")
noise = SubResource("FastNoiseLite_o4civ")
steps = 8
gradient_start = Color(0.56780183, 0.45513594, 0.630845, 1)
gradient_end = Color(0.5222837, 0.45749915, 0.35617962, 1)

10
paintings/painting.gd Normal file
View file

@ -0,0 +1,10 @@
@tool
extends Node2D
class_name Painting
@export_tool_button('Randomize', 'RandomNumberGenerator') var randomize_action = randomize
func randomize(rng_seed := randi()) -> void:
%Noise.rng_seed = rng_seed

View file

@ -0,0 +1 @@
uid://tqu2ms43fhis

49
paintings/painting.tscn Normal file
View file

@ -0,0 +1,49 @@
[gd_scene load_steps=5 format=3 uid="uid://donkfeu1x888o"]
[ext_resource type="Texture2D" uid="uid://b142kv367vbw7" path="res://paintings/frame.png" id="1_6chac"]
[ext_resource type="Script" uid="uid://tqu2ms43fhis" path="res://paintings/painting.gd" id="1_465no"]
[ext_resource type="PackedScene" uid="uid://bjpharjtpysre" path="res://paintings/noise.tscn" id="2_oqt1c"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_465no"]
resource_local_to_scene = true
seed = 1262753571
frequency = 0.0024024888
offset = Vector3(1460.7504, 943.2602, 0)
fractal_type = 0
[node name="Painting" type="Node2D"]
texture_filter = 1
script = ExtResource("1_465no")
[node name="Frame" type="Sprite2D" parent="."]
texture = ExtResource("1_6chac")
[node name="SubViewportContainer" type="SubViewportContainer" parent="."]
offset_left = -146.0
offset_top = -91.0
offset_right = 146.0
offset_bottom = 91.0
stretch = true
stretch_shrink = 4
[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"]
handle_input_locally = false
size = Vector2i(73, 45)
size_2d_override = Vector2i(480, 360)
size_2d_override_stretch = true
render_target_update_mode = 4
[node name="Noise" parent="SubViewportContainer/SubViewport" instance=ExtResource("2_oqt1c")]
unique_name_in_owner = true
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = 0.0
offset_bottom = 0.0
grow_horizontal = 2
grow_vertical = 2
noise = SubResource("FastNoiseLite_465no")
steps = 5
gradient_start = Color(0.31606108, 0.20250309, 0.17190823, 1)
gradient_end = Color(0.48729545, 0.5426228, 0.2567169, 1)
rng_seed = 1262753571