|
|
|
|
@@ -129,8 +129,11 @@ func build_plant_texture(plant_data: PlantData) -> Texture:
|
|
|
|
|
parts_to_place[OriginType.MUTATION_ORIGIN].append(parts_mutation_associations[mutation.id].parts)
|
|
|
|
|
mutation_weights.append(mutation_weight_base)
|
|
|
|
|
|
|
|
|
|
var base_image_coord = blend_part(image_center, -base_part.root.position, base_part)
|
|
|
|
|
populate_part(parts_to_place, weight_per_origin_type, mutation_weights, base_part, base_image_coord)
|
|
|
|
|
var flipped: bool = rng.randi() % 2 == 0
|
|
|
|
|
flipped = false
|
|
|
|
|
|
|
|
|
|
var base_image_coord = blend_part(image_center, -base_part.root.position, base_part, flipped)
|
|
|
|
|
populate_part(parts_to_place, weight_per_origin_type, mutation_weights, base_part, base_image_coord, flipped)
|
|
|
|
|
|
|
|
|
|
texture = ImageTexture.create_from_image(image)
|
|
|
|
|
image.fill(Color.TRANSPARENT)
|
|
|
|
|
@@ -145,27 +148,33 @@ func find_random_matching_attach_ind(attach_to_match: PlantAttach, array: Array[
|
|
|
|
|
return i
|
|
|
|
|
return -1
|
|
|
|
|
|
|
|
|
|
func populate_part(all_parts: Dictionary[OriginType, Array], weight_per_origin_type: Array[int], mutation_weights: Array[int], parent_part: PlantPart, parent_image_coord: Vector2i):
|
|
|
|
|
var part_placed: Array[PlantPart] # same ind as their corresponding attach
|
|
|
|
|
func populate_part(all_parts: Dictionary[OriginType, Array], weight_per_origin_type: Array[int], mutation_weights: Array[int], parent_part: PlantPart, parent_image_coord: Vector2i, parent_is_flipped: bool):
|
|
|
|
|
var placed_parts: Array[PlantPart] # same ind as their corresponding attach
|
|
|
|
|
var part_image_coords: Array[Vector2i] # idem
|
|
|
|
|
var part_is_flipped: Array[bool]
|
|
|
|
|
|
|
|
|
|
# first find and blend parts per attach
|
|
|
|
|
for attach in parent_part.attaches:
|
|
|
|
|
# get part to place
|
|
|
|
|
var part_to_place := get_part(all_parts, weight_per_origin_type, mutation_weights, attach)
|
|
|
|
|
part_placed.append(part_to_place)
|
|
|
|
|
placed_parts.append(part_to_place)
|
|
|
|
|
part_is_flipped.append(rng.randi() % 2 == 0)
|
|
|
|
|
|
|
|
|
|
var attach_position := attach.position
|
|
|
|
|
if parent_is_flipped:
|
|
|
|
|
attach_position *= Vector2(-1, 1)
|
|
|
|
|
|
|
|
|
|
# blend part
|
|
|
|
|
if part_to_place:
|
|
|
|
|
var part_image_coord := blend_part(parent_image_coord, attach.position, part_to_place)
|
|
|
|
|
var part_image_coord := blend_part(parent_image_coord, attach_position, part_to_place, part_is_flipped.back())
|
|
|
|
|
part_image_coords.append(part_image_coord)
|
|
|
|
|
else:
|
|
|
|
|
part_image_coords.append(Vector2i.ZERO)
|
|
|
|
|
|
|
|
|
|
# then populate them
|
|
|
|
|
for i in range(part_placed.size()):
|
|
|
|
|
if part_placed[i] != null:
|
|
|
|
|
populate_part(all_parts, weight_per_origin_type, mutation_weights, part_placed[i], part_image_coords[i])
|
|
|
|
|
for i in range(placed_parts.size()):
|
|
|
|
|
if placed_parts[i] != null:
|
|
|
|
|
populate_part(all_parts, weight_per_origin_type, mutation_weights, placed_parts[i], part_image_coords[i], part_is_flipped[i])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func get_part(all_parts: Dictionary[OriginType, Array], weight_per_origin_type: Array[int], mutation_weights: Array[int], attach: PlantAttach) -> PlantPart:
|
|
|
|
|
@@ -199,11 +208,15 @@ func get_part(all_parts: Dictionary[OriginType, Array], weight_per_origin_type:
|
|
|
|
|
return parts_per_mutations[mutation_parts_ind][ind]
|
|
|
|
|
return null
|
|
|
|
|
|
|
|
|
|
func blend_part(parent_image_coord: Vector2i, attach_position: Vector2, part_to_blend: PlantPart) -> Vector2i:
|
|
|
|
|
var part_image: Image = part_to_blend.image
|
|
|
|
|
func blend_part(parent_image_coord: Vector2i, attach_position: Vector2, part_to_blend: PlantPart, is_flipped: bool) -> Vector2i:
|
|
|
|
|
var part_image := Image.create_from_data(part_to_blend.image.get_width(), part_to_blend.image.get_height(), false, Image.FORMAT_RGBA8, part_to_blend.image.get_data())
|
|
|
|
|
var part_root_position := part_to_blend.root.position
|
|
|
|
|
if is_flipped:
|
|
|
|
|
part_image.flip_x()
|
|
|
|
|
part_root_position *= Vector2(-1, 1)
|
|
|
|
|
var part_image_center: Vector2i = 0.5 * part_image.get_size()
|
|
|
|
|
var part_image_coord: Vector2i = parent_image_coord + Vector2i(attach_position - part_to_blend.root.position)
|
|
|
|
|
image.blend_rect(part_image, Rect2i(Vector2i.ZERO, part_to_blend.image.get_size()), part_image_coord - part_image_center)
|
|
|
|
|
var part_image_coord: Vector2i = parent_image_coord + Vector2i(attach_position - part_root_position)
|
|
|
|
|
image.blend_rect(part_image, Rect2i(Vector2i.ZERO, part_image.get_size()), part_image_coord - part_image_center)
|
|
|
|
|
return part_image_coord
|
|
|
|
|
|
|
|
|
|
func modulate_image(i: Image, color: Color):
|
|
|
|
|
|