disdamoe

Untitled

Dec 12th, 2025
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.28 KB | None | 0 0
  1. use bevy::{
  2.     app::ScheduleRunnerPlugin,
  3.     asset::{LoadState, UnapprovedPathMode},
  4.     camera::primitives::MeshAabb,
  5.     color::palettes::css::WHITE,
  6.     image::BevyDefault,
  7.     light::light_consts::lux::OVERCAST_DAY,
  8.     prelude::*,
  9.     render::{
  10.         render_resource::TextureFormat,
  11.         view::screenshot::{Screenshot, save_to_disk},
  12.     },
  13.     window::ExitCondition,
  14.     winit::WinitPlugin,
  15. };
  16. use bevy_stl::StlPlugin;
  17. use std::path::Path;
  18.  
  19. fn main() {
  20.     let mut app = App::new();
  21.     app.add_plugins(
  22.         DefaultPlugins
  23.             .set(ImagePlugin::default_nearest())
  24.             .set(WindowPlugin {
  25.                 primary_window: None,
  26.                 exit_condition: ExitCondition::DontExit,
  27.                 ..Default::default()
  28.             })
  29.             .set(AssetPlugin {
  30.                 unapproved_path_mode: UnapprovedPathMode::Allow,
  31.                 ..Default::default()
  32.             })
  33.             .disable::<WinitPlugin>(),
  34.     )
  35.     .add_plugins((ScheduleRunnerPlugin::default(), StlPlugin))
  36.     .add_systems(Startup, setup)
  37.     .add_systems(Update, update)
  38.     .run();
  39. }
  40. fn setup(
  41.     mut commands: Commands,
  42.     asset_server: Res<AssetServer>,
  43.     mut materials: ResMut<Assets<StandardMaterial>>,
  44.     mut images: ResMut<Assets<Image>>,
  45. ) {
  46.     let image = Image::new_target_texture(512, 512, TextureFormat::bevy_default());
  47.     let image_handle = images.add(image);
  48.     commands.spawn((
  49.         Mesh3d(asset_server.load(Path::new(
  50.             "/home/dis-da-mor/Documents/code/tag_studio_render/cube.stl",
  51.         ))),
  52.         MeshMaterial3d(materials.add(StandardMaterial {
  53.             base_color: WHITE.into(),
  54.             emissive: LinearRgba::new(1.0, 1.0, 1.0, 1.0),
  55.             ..Default::default()
  56.         })),
  57.         Model,
  58.     ));
  59.     commands.insert_resource(AmbientLight {
  60.         color: WHITE.into(),
  61.         brightness: OVERCAST_DAY,
  62.         ..Default::default()
  63.     });
  64.     commands.spawn((
  65.         Camera3d::default(),
  66.         Camera {
  67.             target: image_handle.into(),
  68.             ..Default::default()
  69.         },
  70.         Transform::default(),
  71.         CameraMain,
  72.     ));
  73. }
  74. #[derive(Component)]
  75. struct Model;
  76. fn update(
  77.     asset_server: Res<AssetServer>,
  78.     model: Query<&Mesh3d, With<Model>>,
  79.     meshes: Res<Assets<Mesh>>,
  80.     mut camera: Query<(&mut Transform, &Camera), With<CameraMain>>,
  81.     mut commands: Commands,
  82.     mut captured: Local<bool>,
  83. ) {
  84.     if *captured {
  85.         return;
  86.     }
  87.     let model_handle = &model.single().unwrap().0;
  88.     match asset_server.get_load_state(model_handle).unwrap() {
  89.         LoadState::Loaded => {}
  90.         LoadState::Failed(asset_load_error) => panic!("{}", asset_load_error),
  91.         _ => {
  92.             return;
  93.         }
  94.     }
  95.     let mesh = meshes.get(model_handle).unwrap();
  96.     let aabb = mesh.compute_aabb().expect("no AABB for the model");
  97.     let trans = Vec3::splat(aabb.half_extents.max_element() * 4.);
  98.     let (mut camera_trans, camera) = camera.single_mut().unwrap();
  99.     camera_trans.translation = trans;
  100.     camera_trans.look_at(aabb.center.into(), Dir3::Y);
  101.     commands
  102.         .spawn(Screenshot(camera.target.clone()))
  103.         .observe(save_to_disk("out.png"));
  104.     *captured = true;
  105. }
  106. #[derive(Debug, Component)]
  107. struct CameraMain;
  108.  
Advertisement
Add Comment
Please, Sign In to add comment