Fully working wrappers
This commit is contained in:
parent
ba78ce8502
commit
a57bdc52d0
5 changed files with 92 additions and 28 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue