branch rotated + optimization

This commit is contained in:
Altaezio
2026-02-22 00:05:35 +01:00
parent 4ca102966b
commit d28e734806
49 changed files with 695 additions and 242 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

View File

@@ -11,7 +11,7 @@ region = Rect2(2118, 923, 371, 391)
[node name="Sprite" type="Sprite2D" unique_id=1642167049 node_paths=PackedStringArray("root", "attaches")] [node name="Sprite" type="Sprite2D" unique_id=1642167049 node_paths=PackedStringArray("root", "attaches")]
texture = SubResource("AtlasTexture_yh7e0") texture = SubResource("AtlasTexture_yh7e0")
script = ExtResource("2_a5yje") script = ExtResource("2_a5yje")
part_name = "LeafG2" part_name = "LeafG3"
type = 1 type = 1
root = NodePath("Root") root = NodePath("Root")
attaches = NodePath("Attaches") attaches = NodePath("Attaches")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,12 +4,14 @@ class_name PlantPart
enum PartType {BASE_PART, BRANCH_PART, LEAF_PART, FLOWER_PART} enum PartType {BASE_PART, BRANCH_PART, LEAF_PART, FLOWER_PART}
@export var texture: Texture @export var texture: Texture
@export var image: Image
@export var type: PartType @export var type: PartType
@export var root: PlantAttach @export var root: PlantAttach
@export var attaches: Array[PlantAttach] # array of vec2 @export var attaches: Array[PlantAttach] # array of vec2
func init(textute_arg: Texture, type_arg: PartType, root_arg: PlantAttach, attaches_arg: Array[PlantAttach]) -> void: func init(textute_arg: Texture, type_arg: PartType, root_arg: PlantAttach, attaches_arg: Array[PlantAttach]) -> void:
texture = textute_arg texture = textute_arg
image = texture.get_image()
type = type_arg type = type_arg
root = root_arg root = root_arg
attaches = attaches_arg attaches = attaches_arg

View File

@@ -1,7 +1,7 @@
extends Node extends Node
const IMAGE_WIDTH := 1024 const IMAGE_WIDTH := 1024
const IMAGE_HEIGHT := 2048 const IMAGE_HEIGHT := 1048
const PLACEHOLDER_SEED_TEXTURE: Texture = preload("res://entities/plants/assets/sprites/default/seed.png") const PLACEHOLDER_SEED_TEXTURE: Texture = preload("res://entities/plants/assets/sprites/default/seed.png")
const PLACEHOLDER_MATURE_TEXTURE: Texture = preload("res://entities/plants/assets/sprites/default/mature.png") const PLACEHOLDER_MATURE_TEXTURE: Texture = preload("res://entities/plants/assets/sprites/default/mature.png")
@@ -16,6 +16,8 @@ const PLACEHOLDER_GROWING_TEXTURE: Texture = preload("res://entities/plants/asse
@export var parts_mutation_associations: Dictionary[String, PartMutationAssociation] @export var parts_mutation_associations: Dictionary[String, PartMutationAssociation]
var rng := RandomNumberGenerator.new() var rng := RandomNumberGenerator.new()
var image: Image = Image.create_empty(IMAGE_WIDTH, IMAGE_HEIGHT, false, Image.FORMAT_RGBA8)
var image_center: Vector2i = Vector2(0.5, 1) * Vector2(image.get_size())
func random_ind(array: Array) -> int: func random_ind(array: Array) -> int:
return rng.randi_range(0, array.size() - 1) return rng.randi_range(0, array.size() - 1)
@@ -37,9 +39,8 @@ func build_seed_texture(_random_seed: int) -> Texture:
func build_plant_texture(plant_data: PlantData) -> Texture: func build_plant_texture(plant_data: PlantData) -> Texture:
rng.seed = plant_data.random_seed rng.seed = plant_data.random_seed
var mature_texture: Texture = PLACEHOLDER_MATURE_TEXTURE var mature_texture: Texture = PLACEHOLDER_MATURE_TEXTURE
var mature_image: Image = Image.create_empty(IMAGE_WIDTH, IMAGE_HEIGHT, false, Image.FORMAT_RGBA8)
var mature_image_center: Vector2i = 0.5 * mature_image.get_size()
var base_part: PlantPart var base_part: PlantPart
var base_image_coord: Vector2i var base_image_coord: Vector2i
var available_attaches: Array[PlantAttach] var available_attaches: Array[PlantAttach]
@@ -56,10 +57,10 @@ func build_plant_texture(plant_data: PlantData) -> Texture:
# var base_part: PlantPart = pick_random(parts_archetype_associations[plant_archetype].bases) # var base_part: PlantPart = pick_random(parts_archetype_associations[plant_archetype].bases)
base_part = pick_random(bases) base_part = pick_random(bases)
var base_image = base_part.texture.get_image() var base_image := base_part.image
var base_image_center: Vector2i = 0.5 * base_image.get_size() var base_image_center: Vector2i = 0.5 * base_image.get_size()
base_image_coord = mature_image_center - Vector2i(base_part.root.position) base_image_coord = image_center - Vector2i(base_part.root.position)
mature_image.blend_rect(base_image, Rect2i(Vector2i.ZERO, base_image.get_size()), base_image_coord - base_image_center) image.blend_rect(base_image, Rect2i(Vector2i.ZERO, base_image.get_size()), base_image_coord - base_image_center)
if branches.size() == 0: if branches.size() == 0:
printerr("No branches in archetype") printerr("No branches in archetype")
@@ -74,7 +75,6 @@ func build_plant_texture(plant_data: PlantData) -> Texture:
for p in association.part_amount: for p in association.part_amount:
parts_to_place.append(pick_random(mutation_possible_parts)) parts_to_place.append(pick_random(mutation_possible_parts))
PlantData.State.GROWING: PlantData.State.GROWING:
# print("Build growing texture") # print("Build growing texture")
# var plant_archetype := plant_data.archetype # var plant_archetype := plant_data.archetype
@@ -84,10 +84,10 @@ func build_plant_texture(plant_data: PlantData) -> Texture:
# var base_part: PlantPart = pick_random(parts_archetype_associations[plant_archetype].baby_bases) # var base_part: PlantPart = pick_random(parts_archetype_associations[plant_archetype].baby_bases)
base_part = pick_random(baby_bases) base_part = pick_random(baby_bases)
var base_image = base_part.texture.get_image() var base_image := base_part.image
var base_image_center: Vector2i = 0.5 * base_image.get_size() var base_image_center: Vector2i = 0.5 * base_image.get_size()
base_image_coord = mature_image_center - Vector2i(base_part.root.position) base_image_coord = image_center - Vector2i(base_part.root.position)
mature_image.blend_rect(base_image, Rect2i(Vector2i.ZERO, base_image.get_size()), base_image_coord - base_image_center) image.blend_rect(base_image, Rect2i(Vector2i.ZERO, base_image.get_size()), base_image_coord - base_image_center)
for m in plant_data.mutations: for m in plant_data.mutations:
# print("mutations: ", m.id) # print("mutations: ", m.id)
@@ -114,16 +114,17 @@ func build_plant_texture(plant_data: PlantData) -> Texture:
var parent_image_coord: Vector2i = parent_image_coords.pop_at(ind) var parent_image_coord: Vector2i = parent_image_coords.pop_at(ind)
var part_image: Image = part.texture.get_image() var part_image: Image = part.image
var part_image_center: Vector2i = 0.5 * part_image.get_size() var part_image_center: Vector2i = 0.5 * part_image.get_size()
var part_image_coord: Vector2i = parent_image_coord + Vector2i(attach.position - part.root.position) var part_image_coord: Vector2i = parent_image_coord + Vector2i(attach.position - part.root.position)
mature_image.blend_rect(part_image, Rect2i(Vector2i.ZERO, part.texture.get_size()), part_image_coord - part_image_center) image.blend_rect(part_image, Rect2i(Vector2i.ZERO, part.image.get_size()), part_image_coord - part_image_center)
for sub_attach in part.attaches: for sub_attach in part.attaches:
available_attaches.append(sub_attach) available_attaches.append(sub_attach)
parent_image_coords.append(part_image_coord) parent_image_coords.append(part_image_coord)
mature_texture = ImageTexture.create_from_image(mature_image) mature_texture = ImageTexture.create_from_image(image)
image.fill(Color.TRANSPARENT)
return mature_texture return mature_texture
## returns -1 if not found ## returns -1 if not found