Skip to main content

pybevy_camera/
lib.rs

1pub mod aabb;
2pub mod bloom;
3pub mod bloom_composite_mode;
4pub mod bloom_prefilter;
5pub mod camera;
6pub mod camera_3d;
7pub mod camera_3d_depth_load_op;
8pub mod camera_3d_depth_texture_usage;
9pub mod camera_main_texture_usages;
10pub mod clear_color;
11pub mod clear_color_config;
12pub mod core_pipeline_plugin;
13pub mod cubemap_frusta;
14pub mod cubemap_layout;
15pub mod cubemap_visible_entities;
16pub mod culling_sphere;
17pub mod exposure;
18pub mod frustum;
19pub mod half_space;
20pub mod inherited_visibility;
21pub mod main_pass_resolution_override;
22pub mod normalized_render_target;
23pub mod physical_camera_parameters;
24pub mod plugin;
25pub mod projection;
26pub mod render_layers;
27pub mod render_target;
28pub mod screen_space_transmission_quality;
29pub mod skybox;
30pub mod sub_camera_view;
31pub mod tonemapping;
32pub mod unit_markers;
33pub mod view_visibility;
34pub mod viewport;
35pub mod visibility;
36pub mod visibility_batch;
37pub mod visibility_class;
38pub mod visibility_range;
39pub mod visible_mesh_entities;
40
41pub use aabb::PyAabb;
42use bevy::{
43    camera::{
44        Camera, Camera2d, Camera3d, CameraMainTextureUsages, ClearColor, Exposure, Projection,
45        RenderTarget,
46        primitives::{Aabb, CubemapFrusta, Frustum},
47        visibility::{
48            CubemapVisibleEntities, NoCpuCulling, NoFrustumCulling, RenderLayers, Visibility,
49            VisibilityClass, VisibilityRange, VisibleMeshEntities,
50        },
51    },
52    core_pipeline::{
53        Skybox,
54        prepass::{DeferredPrepass, DepthPrepass, MotionVectorPrepass, NormalPrepass},
55        tonemapping::Tonemapping,
56    },
57    post_process::bloom::Bloom,
58    prelude::{InheritedVisibility, ViewVisibility},
59};
60pub use bloom::PyBloom;
61pub use bloom_composite_mode::PyBloomCompositeMode;
62pub use bloom_prefilter::PyBloomPrefilter;
63pub use camera::PyCamera;
64pub use camera_3d::PyCamera3d;
65pub use camera_3d_depth_load_op::PyCamera3dDepthLoadOp;
66pub use camera_3d_depth_texture_usage::PyCamera3dDepthTextureUsage;
67pub use camera_main_texture_usages::PyCameraMainTextureUsages;
68pub use clear_color::PyClearColor;
69pub use clear_color_config::PyClearColorConfig;
70pub use core_pipeline_plugin::PyCorePipelinePlugin;
71pub use cubemap_frusta::PyCubemapFrusta;
72pub use cubemap_layout::PyCubemapLayout;
73pub use cubemap_visible_entities::PyCubemapVisibleEntities;
74pub use culling_sphere::PyCullingSphere;
75pub use exposure::PyExposure;
76pub use frustum::PyFrustum;
77pub use half_space::PyHalfSpace;
78pub use inherited_visibility::PyInheritedVisibility;
79pub use main_pass_resolution_override::PyMainPassResolutionOverride;
80pub use normalized_render_target::PyNormalizedRenderTarget;
81pub use physical_camera_parameters::PyPhysicalCameraParameters;
82pub use plugin::PyCameraPlugin;
83pub use projection::{PyOrthographicProjection, PyPerspectiveProjection, PyProjection};
84use pybevy_core::{plugin::plugin_registry, registry::global_registry};
85use pybevy_macros::{
86    component_bridge, newtype_bridge, plugin_bridge, resource_bridge, unit_bridge,
87};
88// Re-export moved types from pybevy_render for backward compatibility
89pub use pybevy_render::{
90    PyColorGrading, PyColorGradingGlobal, PyColorGradingSection, PyHdr, PyMipBias, PyMsaa,
91    PyNoAutomaticBatching, PyNoIndirectDrawing, PyOcclusionCulling, PyTemporalJitter,
92};
93// Re-export moved type from pybevy_sprite for backward compatibility
94pub mod scaling_mode;
95use pyo3::prelude::*;
96pub use render_layers::PyRenderLayers;
97pub use render_target::PyRenderTarget;
98pub use scaling_mode::PyScalingMode;
99pub use screen_space_transmission_quality::PyScreenSpaceTransmissionQuality;
100pub use skybox::PySkybox;
101pub use sub_camera_view::PySubCameraView;
102pub use tonemapping::PyTonemapping;
103pub use unit_markers::{
104    PyCamera2d, PyDeferredPrepass, PyDepthPrepass, PyMotionVectorPrepass, PyNoCpuCulling,
105    PyNoFrustumCulling, PyNormalPrepass,
106};
107pub use view_visibility::PyViewVisibility;
108pub use viewport::PyViewport;
109pub use visibility::PyVisibility;
110pub use visibility_class::PyVisibilityClass;
111pub use visibility_range::PyVisibilityRange;
112pub use visible_mesh_entities::PyVisibleMeshEntities;
113
114// Generate bridges for unit/marker components
115unit_bridge!(NoCpuCulling, PyNoCpuCulling);
116unit_bridge!(NoFrustumCulling, PyNoFrustumCulling);
117unit_bridge!(Camera2d, PyCamera2d);
118unit_bridge!(DepthPrepass, PyDepthPrepass);
119unit_bridge!(NormalPrepass, PyNormalPrepass);
120unit_bridge!(MotionVectorPrepass, PyMotionVectorPrepass);
121unit_bridge!(DeferredPrepass, PyDeferredPrepass);
122
123// Generate bridges for ComponentStorage-based components
124component_bridge!(Camera, PyCamera, view_fields = [is_active]);
125component_bridge!(Camera3d, PyCamera3d);
126component_bridge!(InheritedVisibility, PyInheritedVisibility);
127component_bridge!(ViewVisibility, PyViewVisibility);
128component_bridge!(VisibilityRange, PyVisibilityRange, view_fields = [use_aabb]);
129component_bridge!(Exposure, PyExposure, view_fields = [ev100]);
130component_bridge!(RenderLayers, PyRenderLayers);
131component_bridge!(Aabb, PyAabb);
132component_bridge!(
133    Bloom,
134    PyBloom,
135    view_fields = [
136        intensity,
137        low_frequency_boost,
138        low_frequency_boost_curvature,
139        high_pass_frequency,
140        max_mip_dimension
141    ]
142);
143component_bridge!(CubemapFrusta, PyCubemapFrusta);
144component_bridge!(CubemapVisibleEntities, PyCubemapVisibleEntities);
145component_bridge!(Frustum, PyFrustum);
146component_bridge!(Projection, PyProjection);
147component_bridge!(Visibility, PyVisibility);
148component_bridge!(VisibilityClass, PyVisibilityClass);
149component_bridge!(VisibleMeshEntities, PyVisibleMeshEntities);
150component_bridge!(Skybox, PySkybox, view_fields = [brightness]);
151component_bridge!(RenderTarget, PyRenderTarget);
152
153// Generate bridges for newtype/enum components
154newtype_bridge!(Tonemapping, PyTonemapping);
155newtype_bridge!(CameraMainTextureUsages, PyCameraMainTextureUsages);
156// Note: MainPassResolutionOverride doesn't impl Clone, so we can't use newtype_bridge
157
158// Generate bridges for resources
159resource_bridge!(ClearColor, PyClearColor);
160
161// Generate plugin bridges via macro
162plugin_bridge!(PyCameraPlugin, bevy::camera::CameraPlugin);
163plugin_bridge!(
164    PyCorePipelinePlugin,
165    bevy::core_pipeline::CorePipelinePlugin
166);
167pub fn register_camera_bridges() {
168    // Unit markers use dynamic dispatch
169    global_registry::register_component_bridge(NoCpuCullingBridge);
170    global_registry::register_component_bridge(NoFrustumCullingBridge);
171    global_registry::register_component_bridge(Camera2dBridge);
172    global_registry::register_component_bridge(DepthPrepassBridge);
173    global_registry::register_component_bridge(NormalPrepassBridge);
174    global_registry::register_component_bridge(MotionVectorPrepassBridge);
175    global_registry::register_component_bridge(DeferredPrepassBridge);
176
177    // ComponentStorage-based components
178    global_registry::register_component_bridge(CameraBridge);
179    global_registry::register_component_bridge(Camera3dBridge);
180    global_registry::register_component_bridge(InheritedVisibilityBridge);
181    global_registry::register_component_bridge(ViewVisibilityBridge);
182    global_registry::register_component_bridge(VisibilityRangeBridge);
183    global_registry::register_component_bridge(ExposureBridge);
184    global_registry::register_component_bridge(RenderLayersBridge);
185    global_registry::register_component_bridge(AabbBridge);
186    global_registry::register_component_bridge(BloomBridge);
187    global_registry::register_component_bridge(CubemapFrustaBridge);
188    global_registry::register_component_bridge(CubemapVisibleEntitiesBridge);
189    global_registry::register_component_bridge(FrustumBridge);
190    global_registry::register_component_bridge(ProjectionBridge);
191    global_registry::register_component_bridge(VisibilityBridge);
192    global_registry::register_component_bridge(VisibilityClassBridge);
193    global_registry::register_component_bridge(VisibleMeshEntitiesBridge);
194    global_registry::register_component_bridge(SkyboxBridge);
195    global_registry::register_component_bridge(RenderTargetBridge);
196
197    // Newtype/enum components
198    global_registry::register_component_bridge(TonemappingBridge);
199    global_registry::register_component_bridge(CameraMainTextureUsagesBridge);
200    // Note: MainPassResolutionOverride doesn't impl Clone, so no bridge registration
201
202    // Resources
203    global_registry::register_resource_bridge(ClearColorBridge);
204
205    // Plugins
206    plugin_registry::register_plugin_bridge(CameraPluginBridge);
207    plugin_registry::register_plugin_bridge(CorePipelinePluginBridge);
208
209    // Batch components
210    visibility_batch::register_visibility_batch_bridge();
211    register_exposure_batch();
212    register_camera_batch();
213    register_skybox_batch();
214    register_visibility_range_batch();
215    register_bloom_batch();
216}
217pub fn add_camera_classes(m: &Bound<'_, PyModule>) -> PyResult<()> {
218    register_camera_bridges();
219
220    // Plugins
221    m.add_class::<PyCameraPlugin>()?;
222    m.add_class::<PyCorePipelinePlugin>()?;
223
224    // Unit markers (camera-specific, defined here)
225    m.add_class::<PyNoCpuCulling>()?;
226    m.add_class::<PyNoFrustumCulling>()?;
227    m.add_class::<PyCamera2d>()?;
228    m.add_class::<PyDepthPrepass>()?;
229    m.add_class::<PyNormalPrepass>()?;
230    m.add_class::<PyMotionVectorPrepass>()?;
231    m.add_class::<PyDeferredPrepass>()?;
232
233    // Unit markers (re-exported from pybevy_render for backward compatibility)
234    m.add_class::<PyHdr>()?;
235    m.add_class::<PyNoAutomaticBatching>()?;
236    m.add_class::<PyNoIndirectDrawing>()?;
237    m.add_class::<PyOcclusionCulling>()?;
238
239    // ComponentStorage-based components
240    m.add_class::<PyCamera>()?;
241    m.add_class::<PyCamera3d>()?;
242    m.add_class::<PyInheritedVisibility>()?;
243    m.add_class::<PyViewVisibility>()?;
244    m.add_class::<PyVisibilityRange>()?;
245    m.add_class::<PyExposure>()?;
246    m.add_class::<PyRenderLayers>()?;
247    m.add_class::<PyAabb>()?;
248    m.add_class::<PyBloom>()?;
249    m.add_class::<PyColorGrading>()?;
250    m.add_class::<PyCubemapFrusta>()?;
251    m.add_class::<PyCubemapVisibleEntities>()?;
252    m.add_class::<PyFrustum>()?;
253    m.add_class::<PyProjection>()?;
254    m.add_class::<PyVisibility>()?;
255    m.add_class::<visibility_batch::PyVisibilityBatch>()?;
256    m.add_class::<PyVisibilityClass>()?;
257    m.add_class::<PyVisibleMeshEntities>()?;
258    m.add_class::<PySkybox>()?;
259
260    // ComponentStorage-based (re-exported from pybevy_render for backward compatibility)
261    m.add_class::<PyTemporalJitter>()?;
262
263    // RenderTarget types
264    m.add_class::<PyRenderTarget>()?;
265    m.add_class::<PyNormalizedRenderTarget>()?;
266
267    // Supporting types
268    m.add_class::<PyPhysicalCameraParameters>()?;
269    m.add_class::<PyHalfSpace>()?;
270    m.add_class::<PyCullingSphere>()?;
271    m.add_class::<PyScalingMode>()?;
272    m.add_class::<PyCubemapLayout>()?;
273    m.add_class::<PyScreenSpaceTransmissionQuality>()?;
274    m.add_class::<PyBloomCompositeMode>()?;
275    m.add_class::<PyBloomPrefilter>()?;
276    m.add_class::<PyCamera3dDepthLoadOp>()?;
277    m.add_class::<PyCamera3dDepthTextureUsage>()?;
278    m.add_class::<PyClearColorConfig>()?;
279    m.add_class::<PySubCameraView>()?;
280    m.add_class::<PyPerspectiveProjection>()?;
281    m.add_class::<PyOrthographicProjection>()?;
282
283    // Supporting types (re-exported from pybevy_render for backward compatibility)
284    m.add_class::<PyColorGradingSection>()?;
285    m.add_class::<PyColorGradingGlobal>()?;
286
287    // Newtype/enum components
288    m.add_class::<PyTonemapping>()?;
289    m.add_class::<PyCameraMainTextureUsages>()?;
290    m.add_class::<PyMainPassResolutionOverride>()?;
291    m.add_class::<PyViewport>()?;
292
293    // Newtype/enum (re-exported from pybevy_render for backward compatibility)
294    m.add_class::<PyMsaa>()?;
295    m.add_class::<PyMipBias>()?;
296
297    // Resources
298    m.add_class::<PyClearColor>()?;
299
300    Ok(())
301}
302
303pub fn add_module(parent: &Bound<'_, PyModule>) -> PyResult<()> {
304    let m = PyModule::new(parent.py(), "camera")?;
305    add_camera_classes(&m)?;
306    parent.add_submodule(&m)
307}
308
309pub fn add_core_pipeline_module(parent: &Bound<'_, PyModule>) -> PyResult<()> {
310    let m = PyModule::new(parent.py(), "core_pipeline")?;
311    m.add_class::<PyCorePipelinePlugin>()?;
312    parent.add_submodule(&m)
313}