Advertisement
Guest User

window.rs

a guest
Jul 24th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 7.29 KB | None | 0 0
  1. extern crate cgmath;
  2. extern crate gfx;
  3. extern crate gfx_device_gl;
  4. extern crate gfx_window_glutin;
  5. extern crate glutin;
  6. extern crate genmesh;
  7. extern crate amethyst_renderer;
  8. extern crate rand;
  9. extern crate amethyst;
  10.  
  11. use amethyst::engine::{Application, State, Trans};
  12. use amethyst::context::Context;
  13. use amethyst::config::Element;
  14. use amethyst::ecs::{World, Entity};
  15.  
  16.  
  17.  
  18. use std::time::SystemTime;
  19. use rand::Rng;
  20.  
  21. use gfx::{Device};
  22. use gfx::traits::FactoryExt;
  23.  
  24.  
  25. use cgmath::{Point3, Vector3, Matrix4, EuclideanVector};
  26. use cgmath::{Transform, AffineMatrix3};
  27. use genmesh::generators::SphereUV;
  28. use genmesh::{Triangulate, MapToVertices, Vertices};
  29.  
  30. use amethyst_renderer::VertexPosNormal as Vertex;
  31. use amethyst_renderer::target::{ColorFormat, DepthFormat};
  32. use amethyst_renderer::{Frame, Layer, Texture};
  33.  
  34. fn build_sphere() -> Vec<Vertex> {
  35.     SphereUV::new(32, 32)
  36.         .vertex(|(x, y, z)| Vertex{
  37.             pos: [x, y, z],
  38.             normal: Vector3::new(x, y, z).normalize().into(),
  39.             tex_coord: [0., 0.]
  40.         })
  41.         .triangulate()
  42.         .vertices()
  43.         .collect()
  44. }
  45.  
  46. fn layer_gbuffer() -> Layer {
  47.     use amethyst_renderer::pass::*;
  48.  
  49.     Layer::new("gbuffer",
  50.         vec![
  51.             Clear::new([0., 0., 0., 1.]),
  52.             DrawFlat::new("main", "main")
  53.         ]
  54.     )
  55. }
  56.  
  57. fn pipeline_deferred() -> Vec<Layer> {
  58.     use amethyst_renderer::pass::*;
  59.  
  60.  
  61.     vec![
  62.         layer_gbuffer(),
  63.         Layer::new("main",
  64.             vec![
  65.                 BlitLayer::new("gbuffer", "ka"),
  66.                 Lighting::new("main", "gbuffer", "main")
  67.             ]
  68.         ),
  69.     ]
  70. }
  71.  
  72. struct Example;
  73.  
  74. impl State for Example {
  75.     fn handle_events(&mut self, events: Vec<Entity>, context: &mut Context, _: &mut World) -> Trans {
  76.         use amethyst::context::event::{EngineEvent, Event, VirtualKeyCode};
  77.         let mut trans = Trans::None;
  78.         let storage = context.broadcaster.read::<EngineEvent>();
  79.         for _event in events {
  80.             let event = storage.get(_event).unwrap();
  81.             let event = &event.payload;
  82.             match *event {
  83.                 Event::KeyboardInput(_, _, Some(VirtualKeyCode::Escape)) => trans = Trans::Quit,
  84.                 Event::Closed => trans = Trans::Quit,
  85.                 _ => (),
  86.             }
  87.         }
  88.         trans
  89.     }
  90.  
  91.     fn on_start(&mut self, context: &mut Context, _: &mut World) {
  92.         use amethyst::context::video_context::VideoContext;
  93.         use amethyst::renderer::pass::*;
  94.         use amethyst::renderer::Layer;
  95.  
  96.  
  97.  
  98.         match context.video_context {
  99.             VideoContext::OpenGL { ref mut frame, ref mut factory,.. } => {
  100.                 let mut scene = amethyst_renderer::Scene::new();
  101.  
  102.  
  103.                                 frame.targets.insert(
  104.                                 "gbuffer".into(),
  105.                                 Box::new(amethyst_renderer::target::GeometryBuffer::new( factory, (1024, 768)))
  106.                                 );
  107.                 /*frame.targets.insert(
  108.                     "main".into(),
  109.                     Box::new(amethyst_renderer::target::ColorBuffer{
  110.                         color: ColorFormat,
  111.                         output_depth: main_depth
  112.                     }
  113.                 ));
  114.                 frame.targets.insert(
  115.                     "gbuffer".into(),
  116.                     Box::new(amethyst_renderer::target::GeometryBuffer::new(&mut factory, (800, 600)))
  117.                 );
  118. */
  119.  
  120.  
  121.                 let sphere = build_sphere();
  122.  
  123.                 let (buffer, slice) = factory.create_vertex_buffer_with_slice(&sphere, ());
  124.                 scene.fragments.push(amethyst_renderer::Fragment{
  125.                     buffer: buffer.clone(),
  126.                     slice: slice.clone(),
  127.                     ka: Texture::Constant([0.1, 0.1, 0.3, 1.]),
  128.                     kd: Texture::Constant([1.0, 0.3, 0.3, 1.]),
  129.                     transform: Matrix4::from_translation(Vector3::new(0.0, 0.0, 0.0)).into()
  130.                 });
  131.  
  132.  
  133.  
  134.  
  135.                                 let glayer =  Layer::new("gbuffer",
  136.                                                    vec![
  137.                                                        Clear::new([0., 0., 0., 1.]),
  138.                                                        DrawFlat::new("main", "main")
  139.                                                    ]
  140.                                                );
  141.                                 let dlayer =   Layer::new("main",
  142.                                                        vec![
  143.                                                            BlitLayer::new("gbuffer", "ka"),
  144.                                                            Lighting::new("main", "gbuffer", "main")
  145.                                                        ]
  146.                                                    );
  147.  
  148.  
  149.                                                    frame.layers.push(glayer);
  150.  
  151.                                 frame.layers.push(dlayer);
  152.  
  153.                 scene.lights.push(amethyst_renderer::Light{
  154.                     color: [1., 1., 1., 1.],
  155.                     radius: 1.,
  156.                     center: [40., 40., 40.],
  157.                     propagation_constant: 0.,
  158.                     propagation_linear: 0.,
  159.                     propagation_r_square: 1.,
  160.                 });
  161.  
  162.  
  163.                 frame.scenes.insert("main".into(), scene);
  164.                 let view: AffineMatrix3<f32> = Transform::look_at(
  165.                     Point3::new(0.0 * 6., 1.0, -6.0),
  166.                     Point3::new(0f32, 0.0, 0.0),
  167.                     Vector3::unit_z(),
  168.                 );
  169.                 let proj = cgmath::perspective(cgmath::deg(60.0f32), 1024 as f32 / 768 as f32, 1.0, 100.0);
  170.                 frame.cameras.insert(
  171.                     format!("main"),
  172.                     amethyst_renderer::Camera{projection: proj.into(), view: view.mat.into()}
  173.                 );
  174.  
  175.  
  176.                 /*
  177.                 frame.targets.insert(
  178.                     "main".into(),
  179.                     Box::new(amethyst_renderer::target::ColorBuffer{
  180.                         color: main_color,
  181.                         output_depth: main_depth
  182.                     }
  183.                 ));*/
  184.  
  185.  
  186.  
  187.             }
  188.             #[cfg(windows)]
  189.             VideoContext::Direct3D {  } => {
  190.                 // stub
  191.             },
  192.             VideoContext::Null => (),
  193.         }
  194.     }
  195.  
  196.     fn update(&mut self, context: &mut Context, _: &mut World) -> Trans {
  197.         use amethyst::context::video_context::VideoContext;
  198.         match context.video_context {
  199.             VideoContext::OpenGL { ref window,
  200.                                    ref mut renderer,
  201.                                    ref frame,
  202.                                    ref mut device,
  203.                                    .. } => {
  204.                 renderer.submit(frame, device);
  205.                 window.swap_buffers().unwrap();
  206.             }
  207. #[cfg(windows)]
  208.             VideoContext::Direct3D {  } => {
  209.                 // stub
  210.             },
  211.             VideoContext::Null => (),
  212.         }
  213.         Trans::None
  214.     }
  215. }
  216.  
  217. fn main() {
  218.     use amethyst::context::Config;
  219.     let config = Config::from_file("config/window_example_config.yml").unwrap();
  220.     let mut game = Application::build(Example, config).done();
  221.     game.run();
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement