57 lines
1.7 KiB
Rust
57 lines
1.7 KiB
Rust
use godot::prelude::*;
|
|
use crate::{genetics::manipulations::{PairGenomeModificator,SingleGenomeModificator}, godot_wrapper::godot_genome::GodotGenome};
|
|
|
|
#[derive(GodotClass)]
|
|
#[class(base=Node)]
|
|
pub struct ReferencePairModifier {
|
|
#[export]
|
|
godot_genome_a: Option<Gd<GodotGenome>>,
|
|
#[export]
|
|
godot_genome_b: Option<Gd<GodotGenome>>,
|
|
modifier: Option<PairGenomeModificator>,
|
|
base: Base<Node>,
|
|
}
|
|
|
|
#[godot_api]
|
|
impl INode for ReferencePairModifier{
|
|
fn init(base: Base<Node>) -> Self {
|
|
Self {
|
|
godot_genome_a: None,
|
|
godot_genome_b: None,
|
|
modifier: None,
|
|
base
|
|
}
|
|
}
|
|
fn ready(&mut self) {
|
|
if self.godot_genome_a.is_none() || self.godot_genome_b.is_none() {
|
|
godot_warn!("One of the genomes is not specified!");
|
|
return;
|
|
}
|
|
let (genome_a, genome_b) = (self.godot_genome_a.as_ref().unwrap().bind().get_genome(),self.godot_genome_b.as_ref().unwrap().bind().get_genome());
|
|
|
|
if genome_a.is_none() || genome_b.is_none() {
|
|
godot_warn!("One of genomes does not contain a genome!");
|
|
return;
|
|
}
|
|
|
|
self.modifier = Some(PairGenomeModificator::new(genome_a.unwrap(),genome_b.unwrap()));
|
|
}
|
|
|
|
}
|
|
|
|
#[godot_api]
|
|
impl ReferencePairModifier {
|
|
#[func]
|
|
fn allelic_crossingover(&mut self) {
|
|
if let Some(pair) = self.modifier.as_mut() {
|
|
let (genome_a,genome_b) = pair.allelic_crossingover(None);
|
|
self.godot_genome_a.as_mut().unwrap().bind_mut().set_genome(genome_a);
|
|
self.godot_genome_b.as_mut().unwrap().bind_mut().set_genome(genome_b);
|
|
godot_print!("Kukayan");
|
|
}
|
|
else {
|
|
godot_error!("Modifier is not initialized!");
|
|
}
|
|
}
|
|
}
|
|
|