blr 0.1.0

Rust interface for Blender
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
use super::{
    ArmatureModifier, ArrayModifier, BevelModifier, BooleanModifier, BuildModifier, CastModifier,
    ClothModifier, CollisionModifier, CorrectiveSmoothModifier, CurveModifier,
    DataTransferModifier, DecimateModifier, DisplaceModifier, DynamicPaintModifier,
    EdgeSplitModifier, ExplodeModifier, FluidModifier, HookModifier, LaplaciandeformModifier,
    LaplaciansmoothModifier, LatticeModifier, MaskModifier, MeshCacheModifier, MeshDeformModifier,
    MeshSequenceCacheModifier, MeshToVolumeModifier, MirrorModifier, ModifierImpl,
    MultiresModifier, NodesModifier, NormalEditModifier, OceanModifier, ParticleInstanceModifier,
    ParticleSystemModifier, RemeshModifier, ScrewModifier, ShrinkwrapModifier,
    SimpleDeformModifier, SkinModifier, SmoothModifier, SoftBodyModifier, SolidifyModifier,
    SubsurfModifier, SurfaceDeformModifier, SurfaceModifier, TriangulateModifier,
    UvProjectModifier, UvWarpModifier, VertexWeightEditModifier, VertexWeightMixModifier,
    VertexWeightProximityModifier, VolumeDisplaceModifier, VolumeToMeshModifier, WarpModifier,
    WaveModifier, WeightedNormalModifier, WeldModifier, WireframeModifier,
};
use crate::{
    enums::ModifierType, error::BlError, macros::enum_wrap_inner_fn, result::Result, types::Object,
};
use derive_more::Display;
use pyo3::{intern, PyResult, Python};

/// Wrapper around all supported object modifiers
#[derive(Clone, Debug, Display)]
pub enum Modifier {
    Armature(ArmatureModifier),
    Array(ArrayModifier),
    Bevel(BevelModifier),
    Boolean(BooleanModifier),
    Build(BuildModifier),
    Cast(CastModifier),
    Cloth(ClothModifier),
    Collision(CollisionModifier),
    CorrectiveSmooth(CorrectiveSmoothModifier),
    Curve(CurveModifier),
    DataTransfer(DataTransferModifier),
    Decimate(DecimateModifier),
    Displace(DisplaceModifier),
    DynamicPaint(DynamicPaintModifier),
    EdgeSplit(EdgeSplitModifier),
    Explode(ExplodeModifier),
    Fluid(FluidModifier),
    Hook(HookModifier),
    Laplaciandeform(LaplaciandeformModifier),
    Laplaciansmooth(LaplaciansmoothModifier),
    Lattice(LatticeModifier),
    Mask(MaskModifier),
    MeshCache(MeshCacheModifier),
    MeshDeform(MeshDeformModifier),
    MeshSequenceCache(MeshSequenceCacheModifier),
    MeshToVolume(MeshToVolumeModifier),
    Mirror(MirrorModifier),
    Multires(MultiresModifier),
    Nodes(NodesModifier),
    NormalEdit(NormalEditModifier),
    Ocean(OceanModifier),
    ParticleInstance(ParticleInstanceModifier),
    ParticleSystem(ParticleSystemModifier),
    Remesh(RemeshModifier),
    Screw(ScrewModifier),
    Shrinkwrap(ShrinkwrapModifier),
    SimpleDeform(SimpleDeformModifier),
    Skin(SkinModifier),
    Smooth(SmoothModifier),
    SoftBody(SoftBodyModifier),
    Solidify(SolidifyModifier),
    Subsurf(SubsurfModifier),
    Surface(SurfaceModifier),
    SurfaceDeform(SurfaceDeformModifier),
    Triangulate(TriangulateModifier),
    UvProject(UvProjectModifier),
    UvWarp(UvWarpModifier),
    VertexWeightEdit(VertexWeightEditModifier),
    VertexWeightMix(VertexWeightMixModifier),
    VertexWeightProximity(VertexWeightProximityModifier),
    VolumeDisplace(VolumeDisplaceModifier),
    VolumeToMesh(VolumeToMeshModifier),
    Warp(WarpModifier),
    Wave(WaveModifier),
    WeightedNormal(WeightedNormalModifier),
    Weld(WeldModifier),
    Wireframe(WireframeModifier),
}

impl Modifier {
    pub fn new(py: Python, object: &Object, name: &str, r#type: ModifierType) -> Result<Self> {
        Ok(object.modifiers(py)?.new(py, name, r#type)?)
    }

    pub fn remove(self, py: Python, object: &Object) -> Result<()> {
        Ok(object.modifiers(py)?.remove(py, self)?)
    }

    enum_wrap_inner_fn! {
        { pub fn execution_time(&self, py: Python) -> PyResult<f32> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_execution_time(&mut self, py: Python, value: f32) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn is_active(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_is_active(&mut self, py: Python, value: bool) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn is_override_data(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn name(&self, py: Python) -> PyResult<String> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_name(&mut self, py: Python, value: bool) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn show_expanded(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_show_expanded(&mut self, py: Python, value: &str) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn show_in_editmode(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_show_in_editmode(&mut self, py: Python, value: bool) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn show_on_cage(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_show_on_cage(&mut self, py: Python, value: bool) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn show_render(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_show_render(&mut self, py: Python, value: bool) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn show_viewport(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_show_viewport(&mut self, py: Python, value: bool) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn use_apply_on_spline(&self, py: Python) -> PyResult<bool> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }

    enum_wrap_inner_fn! {
        { pub fn set_use_apply_on_spline(&mut self, py: Python, value: bool) -> PyResult<()> }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }
}

impl pyo3::ToPyObject for Modifier {
    enum_wrap_inner_fn! {
        { fn to_object(&self, py: pyo3::Python<'_>) -> pyo3::PyObject  }
        for [
            Self::Armature, Self::Array, Self::Bevel, Self::Boolean, Self::Build,
            Self::Cast, Self::Cloth, Self::Collision, Self::CorrectiveSmooth,
            Self::Curve, Self::DataTransfer, Self::Decimate, Self::Displace,
            Self::DynamicPaint, Self::EdgeSplit, Self::Explode, Self::Fluid,
            Self::Hook, Self::Laplaciandeform, Self::Laplaciansmooth, Self::Lattice,
            Self::Mask, Self::MeshCache, Self::MeshDeform, Self::MeshSequenceCache,
            Self::MeshToVolume, Self::Mirror, Self::Multires, Self::Nodes,
            Self::NormalEdit, Self::Ocean, Self::ParticleInstance, Self::ParticleSystem,
            Self::Remesh, Self::Screw, Self::Shrinkwrap, Self::SimpleDeform, Self::Skin,
            Self::Smooth, Self::SoftBody, Self::Solidify, Self::Subsurf, Self::Surface,
            Self::SurfaceDeform, Self::Triangulate, Self::UvProject, Self::UvWarp,
            Self::VertexWeightEdit, Self::VertexWeightMix, Self::VertexWeightProximity,
            Self::VolumeDisplace, Self::VolumeToMesh, Self::Warp, Self::Wave,
            Self::WeightedNormal, Self::Weld, Self::Wireframe,
        ]
    }
}

impl pyo3::FromPyObject<'_> for Modifier {
    fn extract(value: &pyo3::PyAny) -> pyo3::PyResult<Self> {
        let modifier_type: ModifierType = value.getattr(intern!(value.py(), "type"))?.extract()?;
        Ok(match modifier_type {
            ModifierType::Armature => Self::Armature(value.into()),
            ModifierType::Array => Self::Array(value.into()),
            ModifierType::Bevel => Self::Bevel(value.into()),
            ModifierType::Boolean => Self::Boolean(value.into()),
            ModifierType::Build => Self::Build(value.into()),
            ModifierType::Cast => Self::Cast(value.into()),
            ModifierType::Cloth => Self::Cloth(value.into()),
            ModifierType::Collision => Self::Collision(value.into()),
            ModifierType::CorrectiveSmooth => Self::CorrectiveSmooth(value.into()),
            ModifierType::Curve => Self::Curve(value.into()),
            ModifierType::DataTransfer => Self::DataTransfer(value.into()),
            ModifierType::Decimate => Self::Decimate(value.into()),
            ModifierType::Displace => Self::Displace(value.into()),
            ModifierType::DynamicPaint => Self::DynamicPaint(value.into()),
            ModifierType::EdgeSplit => Self::EdgeSplit(value.into()),
            ModifierType::Explode => Self::Explode(value.into()),
            ModifierType::Fluid => Self::Fluid(value.into()),
            ModifierType::Hook => Self::Hook(value.into()),
            ModifierType::Laplaciandeform => Self::Laplaciandeform(value.into()),
            ModifierType::Laplaciansmooth => Self::Laplaciansmooth(value.into()),
            ModifierType::Lattice => Self::Lattice(value.into()),
            ModifierType::Mask => Self::Mask(value.into()),
            ModifierType::MeshCache => Self::MeshCache(value.into()),
            ModifierType::MeshDeform => Self::MeshDeform(value.into()),
            ModifierType::MeshSequenceCache => Self::MeshSequenceCache(value.into()),
            ModifierType::MeshToVolume => Self::MeshToVolume(value.into()),
            ModifierType::Mirror => Self::Mirror(value.into()),
            ModifierType::Multires => Self::Multires(value.into()),
            ModifierType::Nodes => Self::Nodes(value.into()),
            ModifierType::NormalEdit => Self::NormalEdit(value.into()),
            ModifierType::Ocean => Self::Ocean(value.into()),
            ModifierType::ParticleInstance => Self::ParticleInstance(value.into()),
            ModifierType::ParticleSystem => Self::ParticleSystem(value.into()),
            ModifierType::Remesh => Self::Remesh(value.into()),
            ModifierType::Screw => Self::Screw(value.into()),
            ModifierType::Shrinkwrap => Self::Shrinkwrap(value.into()),
            ModifierType::SimpleDeform => Self::SimpleDeform(value.into()),
            ModifierType::Skin => Self::Skin(value.into()),
            ModifierType::Smooth => Self::Smooth(value.into()),
            ModifierType::SoftBody => Self::SoftBody(value.into()),
            ModifierType::Solidify => Self::Solidify(value.into()),
            ModifierType::Subsurf => Self::Subsurf(value.into()),
            ModifierType::Surface => Self::Surface(value.into()),
            ModifierType::SurfaceDeform => Self::SurfaceDeform(value.into()),
            ModifierType::Triangulate => Self::Triangulate(value.into()),
            ModifierType::UvProject => Self::UvProject(value.into()),
            ModifierType::UvWarp => Self::UvWarp(value.into()),
            ModifierType::VertexWeightEdit => Self::VertexWeightEdit(value.into()),
            ModifierType::VertexWeightMix => Self::VertexWeightMix(value.into()),
            ModifierType::VertexWeightProximity => Self::VertexWeightProximity(value.into()),
            ModifierType::VolumeDisplace => Self::VolumeDisplace(value.into()),
            ModifierType::VolumeToMesh => Self::VolumeToMesh(value.into()),
            ModifierType::Warp => Self::Warp(value.into()),
            ModifierType::Wave => Self::Wave(value.into()),
            ModifierType::WeightedNormal => Self::WeightedNormal(value.into()),
            ModifierType::Weld => Self::Weld(value.into()),
            ModifierType::Wireframe => Self::Wireframe(value.into()),
        })
    }
}

impl From<Modifier> for ModifierType {
    fn from(value: Modifier) -> Self {
        match value {
            Modifier::Armature(_) => Self::Armature,
            Modifier::Array(_) => Self::Array,
            Modifier::Bevel(_) => Self::Bevel,
            Modifier::Boolean(_) => Self::Boolean,
            Modifier::Build(_) => Self::Build,
            Modifier::Cast(_) => Self::Cast,
            Modifier::Cloth(_) => Self::Cloth,
            Modifier::Collision(_) => Self::Collision,
            Modifier::CorrectiveSmooth(_) => Self::CorrectiveSmooth,
            Modifier::Curve(_) => Self::Curve,
            Modifier::DataTransfer(_) => Self::DataTransfer,
            Modifier::Decimate(_) => Self::Decimate,
            Modifier::Displace(_) => Self::Displace,
            Modifier::DynamicPaint(_) => Self::DynamicPaint,
            Modifier::EdgeSplit(_) => Self::EdgeSplit,
            Modifier::Explode(_) => Self::Explode,
            Modifier::Fluid(_) => Self::Fluid,
            Modifier::Hook(_) => Self::Hook,
            Modifier::Laplaciandeform(_) => Self::Laplaciandeform,
            Modifier::Laplaciansmooth(_) => Self::Laplaciansmooth,
            Modifier::Lattice(_) => Self::Lattice,
            Modifier::Mask(_) => Self::Mask,
            Modifier::MeshCache(_) => Self::MeshCache,
            Modifier::MeshDeform(_) => Self::MeshDeform,
            Modifier::MeshSequenceCache(_) => Self::MeshSequenceCache,
            Modifier::MeshToVolume(_) => Self::MeshToVolume,
            Modifier::Mirror(_) => Self::Mirror,
            Modifier::Multires(_) => Self::Multires,
            Modifier::Nodes(_) => Self::Nodes,
            Modifier::NormalEdit(_) => Self::NormalEdit,
            Modifier::Ocean(_) => Self::Ocean,
            Modifier::ParticleInstance(_) => Self::ParticleInstance,
            Modifier::ParticleSystem(_) => Self::ParticleSystem,
            Modifier::Remesh(_) => Self::Remesh,
            Modifier::Screw(_) => Self::Screw,
            Modifier::Shrinkwrap(_) => Self::Shrinkwrap,
            Modifier::SimpleDeform(_) => Self::SimpleDeform,
            Modifier::Skin(_) => Self::Skin,
            Modifier::Smooth(_) => Self::Smooth,
            Modifier::SoftBody(_) => Self::SoftBody,
            Modifier::Solidify(_) => Self::Solidify,
            Modifier::Subsurf(_) => Self::Subsurf,
            Modifier::Surface(_) => Self::Surface,
            Modifier::SurfaceDeform(_) => Self::SurfaceDeform,
            Modifier::Triangulate(_) => Self::Triangulate,
            Modifier::UvProject(_) => Self::UvProject,
            Modifier::UvWarp(_) => Self::UvWarp,
            Modifier::VertexWeightEdit(_) => Self::VertexWeightEdit,
            Modifier::VertexWeightMix(_) => Self::VertexWeightMix,
            Modifier::VertexWeightProximity(_) => Self::VertexWeightProximity,
            Modifier::VolumeDisplace(_) => Self::VolumeDisplace,
            Modifier::VolumeToMesh(_) => Self::VolumeToMesh,
            Modifier::Warp(_) => Self::Warp,
            Modifier::Wave(_) => Self::Wave,
            Modifier::WeightedNormal(_) => Self::WeightedNormal,
            Modifier::Weld(_) => Self::Weld,
            Modifier::Wireframe(_) => Self::Wireframe,
        }
    }
}

impl From<&Modifier> for ModifierType {
    fn from(value: &Modifier) -> Self {
        match value {
            Modifier::Armature(_) => Self::Armature,
            Modifier::Array(_) => Self::Array,
            Modifier::Bevel(_) => Self::Bevel,
            Modifier::Boolean(_) => Self::Boolean,
            Modifier::Build(_) => Self::Build,
            Modifier::Cast(_) => Self::Cast,
            Modifier::Cloth(_) => Self::Cloth,
            Modifier::Collision(_) => Self::Collision,
            Modifier::CorrectiveSmooth(_) => Self::CorrectiveSmooth,
            Modifier::Curve(_) => Self::Curve,
            Modifier::DataTransfer(_) => Self::DataTransfer,
            Modifier::Decimate(_) => Self::Decimate,
            Modifier::Displace(_) => Self::Displace,
            Modifier::DynamicPaint(_) => Self::DynamicPaint,
            Modifier::EdgeSplit(_) => Self::EdgeSplit,
            Modifier::Explode(_) => Self::Explode,
            Modifier::Fluid(_) => Self::Fluid,
            Modifier::Hook(_) => Self::Hook,
            Modifier::Laplaciandeform(_) => Self::Laplaciandeform,
            Modifier::Laplaciansmooth(_) => Self::Laplaciansmooth,
            Modifier::Lattice(_) => Self::Lattice,
            Modifier::Mask(_) => Self::Mask,
            Modifier::MeshCache(_) => Self::MeshCache,
            Modifier::MeshDeform(_) => Self::MeshDeform,
            Modifier::MeshSequenceCache(_) => Self::MeshSequenceCache,
            Modifier::MeshToVolume(_) => Self::MeshToVolume,
            Modifier::Mirror(_) => Self::Mirror,
            Modifier::Multires(_) => Self::Multires,
            Modifier::Nodes(_) => Self::Nodes,
            Modifier::NormalEdit(_) => Self::NormalEdit,
            Modifier::Ocean(_) => Self::Ocean,
            Modifier::ParticleInstance(_) => Self::ParticleInstance,
            Modifier::ParticleSystem(_) => Self::ParticleSystem,
            Modifier::Remesh(_) => Self::Remesh,
            Modifier::Screw(_) => Self::Screw,
            Modifier::Shrinkwrap(_) => Self::Shrinkwrap,
            Modifier::SimpleDeform(_) => Self::SimpleDeform,
            Modifier::Skin(_) => Self::Skin,
            Modifier::Smooth(_) => Self::Smooth,
            Modifier::SoftBody(_) => Self::SoftBody,
            Modifier::Solidify(_) => Self::Solidify,
            Modifier::Subsurf(_) => Self::Subsurf,
            Modifier::Surface(_) => Self::Surface,
            Modifier::SurfaceDeform(_) => Self::SurfaceDeform,
            Modifier::Triangulate(_) => Self::Triangulate,
            Modifier::UvProject(_) => Self::UvProject,
            Modifier::UvWarp(_) => Self::UvWarp,
            Modifier::VertexWeightEdit(_) => Self::VertexWeightEdit,
            Modifier::VertexWeightMix(_) => Self::VertexWeightMix,
            Modifier::VertexWeightProximity(_) => Self::VertexWeightProximity,
            Modifier::VolumeDisplace(_) => Self::VolumeDisplace,
            Modifier::VolumeToMesh(_) => Self::VolumeToMesh,
            Modifier::Warp(_) => Self::Warp,
            Modifier::Wave(_) => Self::Wave,
            Modifier::WeightedNormal(_) => Self::WeightedNormal,
            Modifier::Weld(_) => Self::Weld,
            Modifier::Wireframe(_) => Self::Wireframe,
        }
    }
}

macro_rules! impl_modifier_conversions_for {
    ($modifier_type:path, $modifier_variant:path, $modifier_struct:ty) => {
        impl From<$modifier_struct> for Modifier {
            fn from(value: $modifier_struct) -> Self {
                $modifier_variant(value)
            }
        }

        impl TryFrom<Modifier> for $modifier_struct {
            type Error = BlError;

            fn try_from(value: Modifier) -> Result<Self> {
                match value {
                    $modifier_variant(value) => Ok(value),
                    incorrect_type => Err(BlError::TypeError(format!(
                        "Blender modifier {name} is of type {incorrect_type}, but {correct_type} is expected",
                        name = Python::with_gil(|py| incorrect_type.name(py))?,
                        incorrect_type = Into::<ModifierType>::into(&incorrect_type),
                        correct_type = $modifier_type,
                    ))),
                }
            }
        }
    };
}
impl_modifier_conversions_for!(ModifierType::Armature, Modifier::Armature, ArmatureModifier);
impl_modifier_conversions_for!(ModifierType::Array, Modifier::Array, ArrayModifier);
impl_modifier_conversions_for!(ModifierType::Bevel, Modifier::Bevel, BevelModifier);
impl_modifier_conversions_for!(ModifierType::Boolean, Modifier::Boolean, BooleanModifier);
impl_modifier_conversions_for!(ModifierType::Build, Modifier::Build, BuildModifier);
impl_modifier_conversions_for!(ModifierType::Cast, Modifier::Cast, CastModifier);
impl_modifier_conversions_for!(ModifierType::Cloth, Modifier::Cloth, ClothModifier);
impl_modifier_conversions_for!(
    ModifierType::Collision,
    Modifier::Collision,
    CollisionModifier
);
impl_modifier_conversions_for!(
    ModifierType::CorrectiveSmooth,
    Modifier::CorrectiveSmooth,
    CorrectiveSmoothModifier
);
impl_modifier_conversions_for!(ModifierType::Curve, Modifier::Curve, CurveModifier);
impl_modifier_conversions_for!(
    ModifierType::DataTransfer,
    Modifier::DataTransfer,
    DataTransferModifier
);
impl_modifier_conversions_for!(ModifierType::Decimate, Modifier::Decimate, DecimateModifier);
impl_modifier_conversions_for!(ModifierType::Displace, Modifier::Displace, DisplaceModifier);
impl_modifier_conversions_for!(
    ModifierType::DynamicPaint,
    Modifier::DynamicPaint,
    DynamicPaintModifier
);
impl_modifier_conversions_for!(
    ModifierType::EdgeSplit,
    Modifier::EdgeSplit,
    EdgeSplitModifier
);
impl_modifier_conversions_for!(ModifierType::Explode, Modifier::Explode, ExplodeModifier);
impl_modifier_conversions_for!(ModifierType::Fluid, Modifier::Fluid, FluidModifier);
impl_modifier_conversions_for!(ModifierType::Hook, Modifier::Hook, HookModifier);
impl_modifier_conversions_for!(
    ModifierType::Laplaciandeform,
    Modifier::Laplaciandeform,
    LaplaciandeformModifier
);
impl_modifier_conversions_for!(
    ModifierType::Laplaciansmooth,
    Modifier::Laplaciansmooth,
    LaplaciansmoothModifier
);
impl_modifier_conversions_for!(ModifierType::Lattice, Modifier::Lattice, LatticeModifier);
impl_modifier_conversions_for!(ModifierType::Mask, Modifier::Mask, MaskModifier);
impl_modifier_conversions_for!(
    ModifierType::MeshCache,
    Modifier::MeshCache,
    MeshCacheModifier
);
impl_modifier_conversions_for!(
    ModifierType::MeshDeform,
    Modifier::MeshDeform,
    MeshDeformModifier
);
impl_modifier_conversions_for!(
    ModifierType::MeshSequenceCache,
    Modifier::MeshSequenceCache,
    MeshSequenceCacheModifier
);
impl_modifier_conversions_for!(
    ModifierType::MeshToVolume,
    Modifier::MeshToVolume,
    MeshToVolumeModifier
);
impl_modifier_conversions_for!(ModifierType::Mirror, Modifier::Mirror, MirrorModifier);
impl_modifier_conversions_for!(ModifierType::Multires, Modifier::Multires, MultiresModifier);
impl_modifier_conversions_for!(ModifierType::Nodes, Modifier::Nodes, NodesModifier);
impl_modifier_conversions_for!(
    ModifierType::NormalEdit,
    Modifier::NormalEdit,
    NormalEditModifier
);
impl_modifier_conversions_for!(ModifierType::Ocean, Modifier::Ocean, OceanModifier);
impl_modifier_conversions_for!(
    ModifierType::ParticleInstance,
    Modifier::ParticleInstance,
    ParticleInstanceModifier
);
impl_modifier_conversions_for!(
    ModifierType::ParticleSystem,
    Modifier::ParticleSystem,
    ParticleSystemModifier
);
impl_modifier_conversions_for!(ModifierType::Remesh, Modifier::Remesh, RemeshModifier);
impl_modifier_conversions_for!(ModifierType::Screw, Modifier::Screw, ScrewModifier);
impl_modifier_conversions_for!(
    ModifierType::Shrinkwrap,
    Modifier::Shrinkwrap,
    ShrinkwrapModifier
);
impl_modifier_conversions_for!(
    ModifierType::SimpleDeform,
    Modifier::SimpleDeform,
    SimpleDeformModifier
);
impl_modifier_conversions_for!(ModifierType::Skin, Modifier::Skin, SkinModifier);
impl_modifier_conversions_for!(ModifierType::Smooth, Modifier::Smooth, SmoothModifier);
impl_modifier_conversions_for!(ModifierType::SoftBody, Modifier::SoftBody, SoftBodyModifier);
impl_modifier_conversions_for!(ModifierType::Solidify, Modifier::Solidify, SolidifyModifier);
impl_modifier_conversions_for!(ModifierType::Subsurf, Modifier::Subsurf, SubsurfModifier);
impl_modifier_conversions_for!(ModifierType::Surface, Modifier::Surface, SurfaceModifier);
impl_modifier_conversions_for!(
    ModifierType::SurfaceDeform,
    Modifier::SurfaceDeform,
    SurfaceDeformModifier
);
impl_modifier_conversions_for!(
    ModifierType::Triangulate,
    Modifier::Triangulate,
    TriangulateModifier
);
impl_modifier_conversions_for!(
    ModifierType::UvProject,
    Modifier::UvProject,
    UvProjectModifier
);
impl_modifier_conversions_for!(ModifierType::UvWarp, Modifier::UvWarp, UvWarpModifier);
impl_modifier_conversions_for!(
    ModifierType::VertexWeightEdit,
    Modifier::VertexWeightEdit,
    VertexWeightEditModifier
);
impl_modifier_conversions_for!(
    ModifierType::VertexWeightMix,
    Modifier::VertexWeightMix,
    VertexWeightMixModifier
);
impl_modifier_conversions_for!(
    ModifierType::VertexWeightProximity,
    Modifier::VertexWeightProximity,
    VertexWeightProximityModifier
);
impl_modifier_conversions_for!(
    ModifierType::VolumeDisplace,
    Modifier::VolumeDisplace,
    VolumeDisplaceModifier
);
impl_modifier_conversions_for!(
    ModifierType::VolumeToMesh,
    Modifier::VolumeToMesh,
    VolumeToMeshModifier
);
impl_modifier_conversions_for!(ModifierType::Warp, Modifier::Warp, WarpModifier);
impl_modifier_conversions_for!(ModifierType::Wave, Modifier::Wave, WaveModifier);
impl_modifier_conversions_for!(
    ModifierType::WeightedNormal,
    Modifier::WeightedNormal,
    WeightedNormalModifier
);
impl_modifier_conversions_for!(ModifierType::Weld, Modifier::Weld, WeldModifier);
impl_modifier_conversions_for!(
    ModifierType::Wireframe,
    Modifier::Wireframe,
    WireframeModifier
);