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 kind: GeneType,
pub sprite: Option<String>,
pub get_child_position: fn(GeneType) -> Vector2
pub get_child_position: fn(GenePlace) -> Vector2
}
impl Gene {
@ -28,7 +28,7 @@ impl Gene {
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 {
plant_source,
place,
@ -46,7 +46,7 @@ impl Gene {
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 {
plant_source,
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;
pub fn peashooter_template() -> Genome {
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![
])
(0,1),
(1,2),
(2,3),
(2,4),
(2,5)
]).unwrap()
}
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 {
Vector2::ZERO
match place {
GenePlace::Head => Vector2::new(4.,-15.),
_ => Vector2::ZERO,
}
}
fn get_place_head(place: GenePlace) -> Vector2 {
Vector2::ZERO
}
fn get_place_leaf(place: GenePlace) -> Vector2 {
Vector2::ZERO
match place {
GenePlace::Eyes => Vector2::new(1.5,-3.5),
GenePlace::Leaf => Vector2::new(-12.,-13.),
GenePlace::Mouth => Vector2::new(6.5,5.),
_ => 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 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)]
#[godot(via = GString)]
@ -36,7 +37,7 @@ impl INode for GodotGenome {
self.genome = match self.from_plant {
PlantType::Peashooter => Some(peashooter_template()),
PlantType::Sunflower => Some(sunflower_template()),
PlantType::CherryBomb => Some(cherry_bomb_template()),
PlantType::CherryBomb => Some(peashooter_template()),
_ => None,
}
}

View file

@ -1,5 +1,5 @@
use godot::prelude::*;
use godot::classes::{Sprite2D,Node2D,INode2D};
use godot::classes::{INode2D, Node2D, Sprite2D, Texture2D};
use crate::godot_wrapper::godot_genome::GodotGenome;
@ -13,27 +13,36 @@ pub struct Plant {
#[godot_api]
impl INode2D for Plant {
//
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 result = Vec::new();
for _ in 0..graph.graph.len() {
result.push(Sprite2D::new_alloc());
for i in 0..genome.graph.len() {
result.push((Sprite2D::new_alloc(),&genome.graph[i]));
}
result
};
for i in 0..graph.graph.len() {
children[i].set_name(&graph.graph[i].0.place.to_string());
for edge in &graph.graph[i].1 {
let edge_handle = children[*edge].clone();
children[i].add_child(&edge_handle);
for i in 0..genome.graph.len() {
children[i].0.set_name(&genome.graph[i].0.place.to_string());
// Setting up genes
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);
}
}