mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-18 07:48:02 +08:00
* Add support structure for new node macro to gcore * Fix compile issues and code generation * Implement new node_fn macro * Implement property translation * Fix NodeIO type generation * Start translating math nodes * Move node implementation to outer scope to allow usage of local imports * Add expose attribute to allow controlling the parameter exposure * Add rust analyzer support for #[implementations] attribute * Migrate logic nodes * Handle where clause properly * Implement argument ident pattern preservation * Implement adjustment layer mapping * Fix node registry types * Fix module paths * Improve demo artwork comptibility * Improve macro error reporting * Fix handling of impl node implementations * Fix nodeio type computation * Fix opacity node and graph type resolution * Fix loading of demo artworks * Fix eslint * Fix typo in macro test * Remove node definitions for Adjustment Nodes * Fix type alias property generation and make adjustments footprint aware * Convert vector nodes * Implement path overrides * Fix stroke node * Fix painted dreams * Implement experimental type level specialization * Fix poisson disk sampling -> all demo artworks should work again * Port text node + make node macro more robust by implementing lifetime substitution * Fix vector node tests * Fix red dress demo + ci * Fix clippy warnings * Code review * Fix primary input issues * Improve math nodes and audit others * Set no_properties when no automatic properties are derived * Port vector generator nodes (could not derive all definitions yet) * Various QA changes and add min/max/mode_range to number parameters * Add min and max for f64 and u32 * Convert gpu nodes and clean up unused nodes * Partially port transform node * Allow implementations on call arg * Port path modify node * Start porting graphic element nodes * Transform nodes in graphic_element.rs * Port brush node * Port nodes in wasm_executior * Rename node macro * Fix formatting * Fix Mandelbrot node * Formatting * Fix Load Image and Load Resource nodes, add scope input to node macro * Remove unnecessary underscores * Begin attemping to make nodes resolution-aware * Infer a generic manual compositon type on generic call arg * Various fixes and work towards merging * Final changes for merge! * Fix tests, probably * More free line removals! --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
88 lines
2.3 KiB
Rust
88 lines
2.3 KiB
Rust
use dyn_any::DynAny;
|
|
pub use uuid_generation::*;
|
|
|
|
#[derive(Clone, Copy, serde::Serialize, serde::Deserialize, specta::Type)]
|
|
pub struct Uuid(
|
|
#[serde(with = "u64_string")]
|
|
#[specta(type = String)]
|
|
u64,
|
|
);
|
|
|
|
mod u64_string {
|
|
use serde::{self, Deserialize, Deserializer, Serializer};
|
|
use std::str::FromStr;
|
|
|
|
// The signature of a serialize_with function must follow the pattern:
|
|
//
|
|
// fn serialize<S>(&T, S) -> Result<S::Ok, S::Error>
|
|
// where
|
|
// S: Serializer
|
|
//
|
|
// although it may also be generic over the input types T.
|
|
pub fn serialize<S>(value: &u64, serializer: S) -> Result<S::Ok, S::Error>
|
|
where
|
|
S: Serializer,
|
|
{
|
|
serializer.serialize_str(&value.to_string())
|
|
}
|
|
|
|
// The signature of a deserialize_with function must follow the pattern:
|
|
//
|
|
// fn deserialize<'de, D>(D) -> Result<T, D::Error>
|
|
// where
|
|
// D: Deserializer<'de>
|
|
//
|
|
// although it may also be generic over the output types T.
|
|
pub fn deserialize<'de, D>(deserializer: D) -> Result<u64, D::Error>
|
|
where
|
|
D: Deserializer<'de>,
|
|
{
|
|
let s = String::deserialize(deserializer)?;
|
|
u64::from_str(&s).map_err(serde::de::Error::custom)
|
|
}
|
|
}
|
|
|
|
mod uuid_generation {
|
|
use core::cell::Cell;
|
|
use rand_chacha::rand_core::{RngCore, SeedableRng};
|
|
use rand_chacha::ChaCha20Rng;
|
|
use std::sync::Mutex;
|
|
|
|
static RNG: Mutex<Option<ChaCha20Rng>> = Mutex::new(None);
|
|
thread_local! {
|
|
pub static UUID_SEED: Cell<Option<u64>> = const { Cell::new(None) };
|
|
}
|
|
|
|
pub fn set_uuid_seed(random_seed: u64) {
|
|
UUID_SEED.with(|seed| seed.set(Some(random_seed)))
|
|
}
|
|
|
|
pub fn generate_uuid() -> u64 {
|
|
let Ok(mut lock) = RNG.lock() else { panic!("UUID mutex poisoned") };
|
|
if lock.is_none() {
|
|
UUID_SEED.with(|seed| {
|
|
let random_seed = seed.get().unwrap_or(42);
|
|
*lock = Some(ChaCha20Rng::seed_from_u64(random_seed));
|
|
})
|
|
}
|
|
lock.as_mut().map(ChaCha20Rng::next_u64).expect("UUID mutex poisoned")
|
|
}
|
|
}
|
|
|
|
#[repr(transparent)]
|
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, PartialOrd, Ord, serde::Serialize, serde::Deserialize, specta::Type, DynAny)]
|
|
pub struct NodeId(pub u64);
|
|
|
|
// TODO: Find and replace all `NodeId(generate_uuid())` with `NodeId::new()`.
|
|
impl NodeId {
|
|
pub fn new() -> Self {
|
|
Self(generate_uuid())
|
|
}
|
|
}
|
|
|
|
impl core::fmt::Display for NodeId {
|
|
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
|
write!(f, "{}", self.0)
|
|
}
|
|
}
|