#![allow(clippy::too_many_arguments)]
#![warn(missing_docs)]
pub use fyrox_core as core;
use std::fmt::Debug;
use crate::core::{reflect::prelude::*, type_traits::prelude::*, visitor::prelude::*};
use serde::{Deserialize, Serialize};
use strum_macros::{AsRefStr, EnumString, VariantNames};
pub mod buffer;
pub mod error;
pub mod framebuffer;
pub mod geometry_buffer;
pub mod gpu_program;
pub mod gpu_texture;
pub mod query;
pub mod read_buffer;
pub mod sampler;
pub mod server;
pub mod stats;
pub mod uniform;
#[macro_export]
macro_rules! define_shared_wrapper {
($name:ident<$ty:ty>) => {
#[derive(Clone)]
#[doc(hidden)]
pub struct $name(pub std::rc::Rc<$ty>);
impl std::ops::Deref for $name {
type Target = $ty;
fn deref(&self) -> &Self::Target {
self.0.deref()
}
}
};
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Hash,
Debug,
Deserialize,
Visit,
Eq,
Reflect,
AsRefStr,
EnumString,
VariantNames,
TypeUuidProvider,
Default,
)]
#[type_uuid(id = "47aff01a-7daa-427c-874c-87464a7ffe28")]
pub enum PolygonFillMode {
Point,
Line,
#[default]
Fill,
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Eq,
Ord,
Hash,
Visit,
Serialize,
Deserialize,
Debug,
Reflect,
AsRefStr,
EnumString,
VariantNames,
Default,
TypeUuidProvider,
)]
#[type_uuid(id = "95922b07-d532-4183-8f3f-89ebe058b6f1")]
pub enum CompareFunc {
Never,
Less,
Equal,
#[default]
LessOrEqual,
Greater,
NotEqual,
GreaterOrEqual,
Always,
}
#[derive(
Copy,
Clone,
Hash,
PartialOrd,
PartialEq,
Eq,
Ord,
Serialize,
Deserialize,
Visit,
Debug,
Reflect,
AsRefStr,
EnumString,
VariantNames,
Default,
TypeUuidProvider,
)]
#[type_uuid(id = "8d99d682-8993-4a42-bdab-77bee84e62c9")]
pub enum BlendFactor {
#[default]
Zero,
One,
SrcColor,
OneMinusSrcColor,
DstColor,
OneMinusDstColor,
SrcAlpha,
OneMinusSrcAlpha,
DstAlpha,
OneMinusDstAlpha,
ConstantColor,
OneMinusConstantColor,
ConstantAlpha,
OneMinusConstantAlpha,
SrcAlphaSaturate,
Src1Color,
OneMinusSrc1Color,
Src1Alpha,
OneMinusSrc1Alpha,
}
#[derive(
Copy,
Clone,
Hash,
PartialOrd,
PartialEq,
Eq,
Ord,
Serialize,
Deserialize,
Visit,
Debug,
Reflect,
Default,
AsRefStr,
EnumString,
VariantNames,
TypeUuidProvider,
)]
#[type_uuid(id = "2c7b09ab-d2b1-4fbb-9c5f-95b31584b048")]
pub enum BlendMode {
#[default]
Add,
Subtract,
ReverseSubtract,
Min,
Max,
}
#[derive(
Copy,
Clone,
Default,
PartialOrd,
PartialEq,
Ord,
Eq,
Hash,
Serialize,
Deserialize,
Visit,
Debug,
Reflect,
TypeUuidProvider,
)]
#[type_uuid(id = "83403a0b-b16f-42a4-ba62-4d72c3318691")]
pub struct BlendEquation {
pub rgb: BlendMode,
pub alpha: BlendMode,
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Ord,
Eq,
Hash,
Serialize,
Deserialize,
Visit,
Debug,
Reflect,
TypeUuidProvider,
)]
#[type_uuid(id = "42021d36-fdd7-4c14-9a8a-9598c13dbf96")]
pub struct BlendFunc {
pub sfactor: BlendFactor,
pub dfactor: BlendFactor,
pub alpha_sfactor: BlendFactor,
pub alpha_dfactor: BlendFactor,
}
impl BlendFunc {
pub fn new(sfactor: BlendFactor, dfactor: BlendFactor) -> Self {
Self {
sfactor,
dfactor,
alpha_sfactor: sfactor,
alpha_dfactor: dfactor,
}
}
pub fn new_separate(
sfactor: BlendFactor,
dfactor: BlendFactor,
alpha_sfactor: BlendFactor,
alpha_dfactor: BlendFactor,
) -> Self {
Self {
sfactor,
dfactor,
alpha_sfactor,
alpha_dfactor,
}
}
}
impl Default for BlendFunc {
fn default() -> Self {
Self {
sfactor: BlendFactor::One,
dfactor: BlendFactor::Zero,
alpha_sfactor: BlendFactor::One,
alpha_dfactor: BlendFactor::Zero,
}
}
}
#[derive(
Copy, Clone, PartialOrd, PartialEq, Hash, Debug, Serialize, Deserialize, Visit, Eq, Reflect,
)]
pub struct ColorMask {
pub red: bool,
pub green: bool,
pub blue: bool,
pub alpha: bool,
}
impl Default for ColorMask {
fn default() -> Self {
Self {
red: true,
green: true,
blue: true,
alpha: true,
}
}
}
impl ColorMask {
pub fn all(value: bool) -> Self {
Self {
red: value,
green: value,
blue: value,
alpha: value,
}
}
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Hash,
Debug,
Deserialize,
Visit,
Eq,
Reflect,
AsRefStr,
EnumString,
VariantNames,
Default,
TypeUuidProvider,
)]
#[type_uuid(id = "30a58aa9-eda9-4673-bc50-046f6d46d122")]
pub enum PolygonFace {
Front,
Back,
#[default]
FrontAndBack,
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Hash,
Debug,
Serialize,
Deserialize,
Visit,
Eq,
Reflect,
TypeUuidProvider,
)]
#[type_uuid(id = "9d03366d-2537-4ef2-8e19-54f06d81d05e")]
pub struct StencilFunc {
pub func: CompareFunc,
pub ref_value: u32,
pub mask: u32,
}
impl Default for StencilFunc {
fn default() -> Self {
Self {
func: CompareFunc::Always,
ref_value: 0,
mask: 0xFFFF_FFFF,
}
}
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Hash,
Debug,
Serialize,
Deserialize,
Visit,
Eq,
Reflect,
AsRefStr,
EnumString,
VariantNames,
Default,
TypeUuidProvider,
)]
#[type_uuid(id = "3e057392-6900-4506-880d-21391e6b4787")]
pub enum StencilAction {
#[default]
Keep,
Zero,
Replace,
Incr,
IncrWrap,
Decr,
DecrWrap,
Invert,
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Hash,
Debug,
Serialize,
Deserialize,
Visit,
Eq,
Reflect,
TypeUuidProvider,
)]
#[type_uuid(id = "5eec1018-60aa-4ebb-8884-547ba5f4b398")]
pub struct StencilOp {
pub fail: StencilAction,
pub zfail: StencilAction,
pub zpass: StencilAction,
pub write_mask: u32,
}
impl StencilOp {
pub fn eq_actions(&self, other: &StencilOp) -> bool {
self.fail == other.fail && self.zfail == other.zfail && self.zpass == other.zpass
}
}
impl Default for StencilOp {
fn default() -> Self {
Self {
fail: Default::default(),
zfail: Default::default(),
zpass: Default::default(),
write_mask: 0xFFFF_FFFF,
}
}
}
#[derive(
Copy,
Clone,
PartialOrd,
PartialEq,
Hash,
Debug,
Serialize,
Deserialize,
Visit,
Eq,
Reflect,
AsRefStr,
EnumString,
VariantNames,
Default,
TypeUuidProvider,
)]
#[type_uuid(id = "9f467cd4-0a65-435d-b5d6-301493dbdc9b")]
pub enum CullFace {
#[default]
Back,
Front,
}
#[derive(
Serialize, Deserialize, Default, Visit, Debug, PartialEq, Clone, Eq, Reflect, TypeUuidProvider,
)]
#[type_uuid(id = "4c0afa4d-5b67-43b3-b486-5ec64cc20e7d")]
pub struct BlendParameters {
pub func: BlendFunc,
pub equation: BlendEquation,
}
#[derive(
Serialize,
Deserialize,
Default,
Visit,
Debug,
PartialEq,
Clone,
Copy,
Eq,
Reflect,
TypeUuidProvider,
)]
#[type_uuid(id = "22be6d48-772e-4dc0-bae5-37f5e8f3a3db")]
pub struct ScissorBox {
pub x: i32,
pub y: i32,
pub width: i32,
pub height: i32,
}
#[derive(Serialize, Deserialize, Visit, Debug, PartialEq, Clone, Eq, Reflect)]
pub struct DrawParameters {
pub cull_face: Option<CullFace>,
pub color_write: ColorMask,
pub depth_write: bool,
pub stencil_test: Option<StencilFunc>,
pub depth_test: Option<CompareFunc>,
pub blend: Option<BlendParameters>,
pub stencil_op: StencilOp,
pub scissor_box: Option<ScissorBox>,
}
impl Default for DrawParameters {
fn default() -> Self {
Self {
cull_face: Some(CullFace::Back),
color_write: Default::default(),
depth_write: true,
stencil_test: None,
depth_test: Some(CompareFunc::Less),
blend: None,
stencil_op: Default::default(),
scissor_box: None,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Default)]
pub enum ElementRange {
#[default]
Full,
Specific {
offset: usize,
count: usize,
},
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum ElementKind {
Triangle,
Line,
Point,
}
impl ElementKind {
pub fn index_per_element(self) -> usize {
match self {
ElementKind::Triangle => 3,
ElementKind::Line => 2,
ElementKind::Point => 1,
}
}
}