Fully working wrappers

This commit is contained in:
Rendo 2026-04-05 22:02:45 +05:00
commit a57bdc52d0
5 changed files with 92 additions and 28 deletions

View file

@ -15,7 +15,7 @@ pub struct Gene {
pub place: GenePlace, pub place: GenePlace,
pub kind: GeneType, pub kind: GeneType,
pub sprite: Option<String>, pub sprite: Option<String>,
pub get_child_position: fn(GeneType) -> Vector2 pub get_child_position: fn(GenePlace) -> Vector2
} }
impl Gene { impl Gene {
@ -28,7 +28,7 @@ impl Gene {
get_child_position: |_| Vector2::ZERO, get_child_position: |_| Vector2::ZERO,
} }
} }
pub fn structural(plant_source: GeneSource, place: GenePlace, kind: GeneType, get_child_position: fn(GeneType) -> Vector2) -> Self { pub fn structural(plant_source: GeneSource, place: GenePlace, kind: GeneType, get_child_position: fn(GenePlace) -> Vector2) -> Self {
Self { Self {
plant_source, plant_source,
place, place,
@ -46,7 +46,7 @@ impl Gene {
get_child_position: |_| Vector2::ZERO, get_child_position: |_| Vector2::ZERO,
} }
} }
pub fn new(plant_source: GeneSource, place: GenePlace, kind: GeneType, sprite: String, get_child_position: fn(GeneType) -> Vector2) -> Self { pub fn new(plant_source: GeneSource, place: GenePlace, kind: GeneType, sprite: String, get_child_position: fn(GenePlace) -> Vector2) -> Self {
Self { Self {
plant_source, plant_source,
place, place,

View file

@ -1,27 +1,43 @@
use crate::genetics::{gene::{Gene, GenePlace}, genome::Genome}; use crate::genetics::{gene::{Gene, GenePlace, GeneSource, GeneType}, genome::Genome};
use godot::builtin::Vector2; use godot::builtin::Vector2;
pub fn peashooter_template() -> Genome { pub fn peashooter_template() -> Genome {
Genome::from_edges(vec![ Genome::from_edges(vec![
Gene::new() Gene::new(GeneSource::Peashooter, GenePlace::Root, GeneType::pure_producer(|_|{todo!()}), "peashooter/peashooter_base.tres".to_string(), get_place_base),
Gene::new(GeneSource::Peashooter, GenePlace::Stem, GeneType::fill_all(),"peashooter/peashooter_stem.tres".to_string(),get_place_stem),
Gene::new(GeneSource::Peashooter, GenePlace::Head, GeneType::fill_all(),"peashooter/peashooter_head.tres".to_string(),get_place_head),
Gene::visible(GeneSource::Peashooter, GenePlace::Eyes, GeneType::Structural,"peashooter/peashooter_eyes.tres".to_string()),
Gene::visible(GeneSource::Peashooter, GenePlace::Mouth, GeneType::consumer(|_|{}), "peashooter/peashooter_mouth.tres".to_string()),
Gene::visible(GeneSource::Peashooter, GenePlace::Leaf, GeneType::modifier(|_|{todo!()}), "peashooter/peashooter_leaf.tres".to_string()),
], vec![ ], vec![
(0,1),
]) (1,2),
(2,3),
(2,4),
(2,5)
]).unwrap()
} }
fn get_place_base(place: GenePlace) -> Vector2 { fn get_place_base(place: GenePlace) -> Vector2 {
Vector2::ZERO match place {
GenePlace::Stem => Vector2::new(-1.5,-10.5),
_ => Vector2::ZERO,
}
} }
fn get_place_stem(place: GenePlace) -> Vector2 { fn get_place_stem(place: GenePlace) -> Vector2 {
Vector2::ZERO match place {
GenePlace::Head => Vector2::new(4.,-15.),
_ => Vector2::ZERO,
}
} }
fn get_place_head(place: GenePlace) -> Vector2 { fn get_place_head(place: GenePlace) -> Vector2 {
Vector2::ZERO match place {
} GenePlace::Eyes => Vector2::new(1.5,-3.5),
GenePlace::Leaf => Vector2::new(-12.,-13.),
fn get_place_leaf(place: GenePlace) -> Vector2 { GenePlace::Mouth => Vector2::new(6.5,5.),
Vector2::ZERO _ => Vector2::ZERO,
}
} }

View file

@ -0,0 +1,38 @@
use crate::genetics::{gene::{Gene, GenePlace, GeneSource, GeneType}, genome::Genome};
use godot::builtin::Vector2;
pub fn sunflower_template() -> Genome {
Genome::from_edges(vec![
Gene::new(GeneSource::Sunflower, GenePlace::Root, GeneType::Structural,"sunflower/sunflower_base.tres".to_string(),get_place_base),
Gene::new(GeneSource::Sunflower, GenePlace::Stem, GeneType::Structural,"sunflower/sunflower_stem.tres".to_string(),get_place_stem),
Gene::new(GeneSource::Sunflower, GenePlace::Head, GeneType::Structural, "sunflower/sunflower_head.tres".to_string(),get_place_head), // Needs to be Producer
Gene::visible(GeneSource::Sunflower, GenePlace::Eyes, GeneType::Structural, "sunflower/sunflower_eyes.tres".to_string()),
Gene::visible(GeneSource::Sunflower, GenePlace::Mouth, GeneType::consumer(|_|{}),"sunflower/sunflower_mouth.tres".to_string())
], vec![
(0,1),
(1,2),
(2,3),
(2,4)
]).unwrap()
}
fn get_place_base(place: GenePlace) -> Vector2 {
match place {
GenePlace::Stem => Vector2::new(-1.,-12.),
_ => Vector2::ZERO
}
}
fn get_place_stem(place: GenePlace) -> Vector2 {
match place {
GenePlace::Head => Vector2::new(4.,-13.),
_ => Vector2::ZERO
}
}
fn get_place_head(place: GenePlace) -> Vector2 {
match place {
GenePlace::Mouth => Vector2::new(1.,4.),
GenePlace::Eyes => Vector2::new(1.,-2.),
_ =>return Vector2::ZERO
}
}

View file

@ -2,7 +2,8 @@ use godot::prelude::*;
use godot::classes::{Node,INode}; use godot::classes::{Node,INode};
use crate::genetics::genome::Genome; use crate::genetics::genome::Genome;
use crate::genetics::plant_templates::{cherry_bomb_template, peashooter_template, sunflower_template}; use crate::genetics::plants::peashooter::peashooter_template;
use crate::genetics::plants::sunflower::sunflower_template;
#[derive(GodotConvert, Var, Export, Default, Clone)] #[derive(GodotConvert, Var, Export, Default, Clone)]
#[godot(via = GString)] #[godot(via = GString)]
@ -36,7 +37,7 @@ impl INode for GodotGenome {
self.genome = match self.from_plant { self.genome = match self.from_plant {
PlantType::Peashooter => Some(peashooter_template()), PlantType::Peashooter => Some(peashooter_template()),
PlantType::Sunflower => Some(sunflower_template()), PlantType::Sunflower => Some(sunflower_template()),
PlantType::CherryBomb => Some(cherry_bomb_template()), PlantType::CherryBomb => Some(peashooter_template()),
_ => None, _ => None,
} }
} }

View file

@ -1,5 +1,5 @@
use godot::prelude::*; use godot::prelude::*;
use godot::classes::{Sprite2D,Node2D,INode2D}; use godot::classes::{INode2D, Node2D, Sprite2D, Texture2D};
use crate::godot_wrapper::godot_genome::GodotGenome; use crate::godot_wrapper::godot_genome::GodotGenome;
@ -13,27 +13,36 @@ pub struct Plant {
#[godot_api] #[godot_api]
impl INode2D for Plant { impl INode2D for Plant {
//
fn ready(&mut self) { fn ready(&mut self) {
let Some(genome) = self.genome.clone() else { return; }; let Some(godot_genome) = self.genome.clone() else { return; };
let Some(graph )= genome.bind().get_genome() else { return; }; let Some(genome)= godot_genome.bind().get_genome() else { return; };
let mut children = { let mut children = {
let mut result = Vec::new(); let mut result = Vec::new();
for _ in 0..graph.graph.len() { for i in 0..genome.graph.len() {
result.push(Sprite2D::new_alloc()); result.push((Sprite2D::new_alloc(),&genome.graph[i]));
} }
result result
}; };
for i in 0..graph.graph.len() {
children[i].set_name(&graph.graph[i].0.place.to_string()); for i in 0..genome.graph.len() {
for edge in &graph.graph[i].1 { children[i].0.set_name(&genome.graph[i].0.place.to_string());
let edge_handle = children[*edge].clone(); // Setting up genes
children[i].add_child(&edge_handle); if let Some(sprite) = genome.graph[i].0.sprite.clone() {
children[i].0.set_texture(&load::<Texture2D>(&("res://assets/sprites/".to_string() + &sprite)));
}
// Setting up children
for edge in &genome.graph[i].1 {
let mut gene_sprite = children[*edge].0.clone();
gene_sprite.set_position((children[i].1.0.get_child_position)(children[*edge].1.0.place.clone()));
children[i].0.add_child(&gene_sprite);
} }
} }
self.base_mut().add_child(&children[0]); self.base_mut().add_child(&children[0].0);
} }
} }