#include "pch.h" #include "App.h" #include "dinput.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "EditorResourceStreamManager.h" namespace zp { namespace zp_test { namespace { const bool save_resources = false; const String animations_path("D:/work/assets/tmp/"); } //namespace AppInputEventListener::AppInputEventListener() { } AppInputEventListener::AppInputEventListener( App* app, const Float speed ) : m_app(app) , m_speed(speed) { } AppInputEventListener::~AppInputEventListener() { } void AppInputEventListener::on_event( const input_system::InputEvent& event_data ) { using namespace input_system; using namespace input_system_pc; if(event_data.value() == mouse_axe_x) { Int x = event_data.offset(); m_app->set_mouse_x(x); } if(event_data.value() == mouse_axe_y) { Int y = event_data.offset(); m_app->set_mouse_y(y); } } AppInputEventListenerAim::AppInputEventListenerAim() { } AppInputEventListenerAim::AppInputEventListenerAim( App* app, const Bool aim ) : m_app(app) , m_aim(aim) { } AppInputEventListenerAim::~AppInputEventListenerAim() { } void AppInputEventListenerAim::on_event( const input_system::InputEvent& event_data ) { } App::App() : m_time(boost::numeric_cast(time(NULL)) / 1000.0f) , m_mouse_x(0) , m_mouse_y(0) { SharedPtr stream_manager(new EditorResourceStreamManager()); resource_manager::create_resource_context_manager(stream_manager); SharedPtr shaders_resource_context(new graphics::ShaderResourceContext(stream_manager)); resource_manager::resource_context_manager().add_resource_context(graphics::pixel_shader_resource_type(), shaders_resource_context); resource_manager::resource_context_manager().add_resource_context(graphics::vertex_shader_resource_type(), shaders_resource_context); SharedPtr textures_resource_context(new graphics::TextureResourceContext(stream_manager)); resource_manager::resource_context_manager().add_resource_context(graphics::texture_resource_type(), textures_resource_context); SharedPtr effects_resource_context(new render_system::EffectResourceContext(stream_manager)); resource_manager::resource_context_manager().add_resource_context(render_system::effect_resource_type(), effects_resource_context); SharedPtr material_resource_context(new render_system::MaterialResourceContext(stream_manager)); resource_manager::resource_context_manager().add_resource_context(render_system::material_resource_type(), material_resource_context); SharedPtr font_resource_context(new render_system::FontResourceContext(stream_manager)); resource_manager::resource_context_manager().add_resource_context(render_system::font_resource_type(), font_resource_context); resource_manager::resource_context_manager().add_resource_context(render_system::font_implementation_resource_type(), font_resource_context); //SharedPtr skeletal_animation_resource_context(new animation::SkeletalAnimationResourceContext(stream_manager)); //resource_manager::resource_context_manager().add_resource_context(animation::skeletal_animation_resource_type(), skeletal_animation_resource_context); //SharedPtr track_resource_context(new animation::TrackResourceContext(stream_manager)); //resource_manager::resource_context_manager().add_resource_context(animation::track_resource_type(), track_resource_context); //SharedPtr animation_mask_resource_context(new animation::AnimationMaskResourceContext(stream_manager)); //resource_manager::resource_context_manager().add_resource_context(animation::animation_mask_resource_type(), animation_mask_resource_context); } App::~App() { } SharedPtr App::create_device(void* window_handle, const mathematics::Dimensions2I& window_size, const graphics::DisplayAdapter display_adapter) { graphics::GraphicsDeviceCreationParameters creation_parameters; creation_parameters.set_hwnd(reinterpret_cast(window_handle)); creation_parameters.set_dimensions(window_size); creation_parameters.set_display_adapter(display_adapter); SharedPtr device(new graphics_dx9::GraphicsDevice()); if (!device->create(creation_parameters)) return SharedPtr(); device->set_clear_color(image::Color4F(0, 0, 0, 0)); return device; } bool App::on_create() { m_window.reset(new user_interface_pc::Window("zp")); m_window->create(math::Vector2I(0, 0), math::Dimensions2I(800, 600), window::window_style_normal); m_device = create_device(m_window->hwnd(), m_window->dimensions(), graphics::da_primary); m_render_context.reset(new render_system::RenderContext(m_device)); m_input_system.reset(new input_system::InputSystem(m_window->hwnd())); // Input system SharedPtr input_context = m_input_system->create_context(0); if(input_context) { using namespace input_system; using namespace input_system_pc; m_input_event_listener.reset(new AppInputEventListener(this, 0.0f)); input_context->register_listener( InputEventUID(idid_win_mouse, ie_on_change, mouse_axe_x), m_input_event_listener); input_context->register_listener( InputEventUID(idid_win_mouse, ie_on_change, mouse_axe_y), m_input_event_listener); m_input_event_listener.reset(new AppInputEventListenerAim(this, false)); input_context->register_listener( InputEventUID(idid_dx_keyboard, ie_on_button_down, DIK_A), m_input_event_listener); m_input_event_listener.reset(new AppInputEventListenerAim(this, true)); input_context->register_listener( InputEventUID(idid_dx_keyboard, ie_on_button_down, DIK_S), m_input_event_listener); } m_renderer.reset(new render_system::ShapesRenderer(m_render_context.get())); // Particle System m_particle_system.reset(new particles::ParticleSystem()); SharedPtr renderable(new particles::ParticleSystemRenderable()); renderable->set_particle_system(m_particle_system); m_particle_system->set_renderable(renderable); m_particle_container.reset(new particles::ParticleContainer()); m_particle_emiter.reset(new particles::Emiter()); m_particle_system->add_container(m_particle_container); m_particle_system->add_emiter(m_particle_emiter); SharedPtr renderer(new particles::PointRenderer()); renderer->set_renderer(m_renderer); m_particle_system->add_renderer(renderer); SharedPtr render_updater(new particles::PointRendererRenderUpdater()); render_updater->set_particle_container(m_particle_container); render_updater->set_renderer(renderer); SharedPtr render_updater_init_policy(new particles::RenderUpdaterInitPolicy()); render_updater_init_policy->set_render_updater(render_updater); m_particle_emiter->add_init_policy(render_updater_init_policy); SharedPtr emit_policy(new particles::CommonEmitPolicy()); emit_policy->set_emit_rate(100.0f); m_particle_emiter->add_emit_policy(emit_policy); SharedPtr life_init_policy(new particles::RandomLifeInitPolicy()); life_init_policy->set_max_life(2.0f); m_particle_emiter->add_init_policy(life_init_policy); SharedPtr position_init_policy(new particles::PointPositionInitPolicy()); m_particle_emiter->add_init_policy(position_init_policy); SharedPtr velocity_init_policy(new particles::ConeVelocityInitPolicy()); velocity_init_policy->set_min_z_angle(-math::pi * 0.25f); velocity_init_policy->set_max_z_angle(math::pi * 0.25f); velocity_init_policy->set_min_speed(0.1f); velocity_init_policy->set_max_speed(0.5f); m_particle_emiter->add_init_policy(velocity_init_policy); m_particle_emiter->set_particle_container(m_particle_container); SharedPtr position_update_policy(new particles::PositionUpdatePolicy()); m_particle_container->add_update_policy(position_update_policy); SharedPtr life_update_policy(new particles::CommonLifeUpdatePolicy()); m_particle_container->add_update_policy(life_update_policy); m_gravity_velocity_policy.reset(new particles::GravityVelocityUpdatePolicy()); m_particle_container->add_update_policy(m_gravity_velocity_policy); SharedPtr common_render_update_policy(new particles::CommonRenderUpdatePolicy()); m_particle_container->add_render_update_policy(common_render_update_policy); SharedPtr death_particle_controller(new particles::DeathParticleController()); m_particle_container->add_particle_controller(death_particle_controller); m_particle_position_accessor.set_container(m_particle_container); m_particle_container->reserve(10000); return true; } void App::on_idle() { Base::on_idle(); m_window->process_messages(); m_input_system->update(); Float current_time = boost::numeric_cast(time(NULL)) / 1000.0f; Float dt = 1.0f / 15.0f; m_time = current_time; m_particle_system->update(dt); m_particle_system->renderable()->update(dt); render(); } bool App::is_valid() const { return m_window->is_valid(); } void App::render() { m_device->clear(graphics::GraphicsDevice::cf_back_buffer | graphics::GraphicsDevice::cf_depth_buffer, 1.f, 0); m_device->begin_scene(); m_particle_system->renderable()->render(render_system::RenderInfo(m_render_context.get())); //m_device->render(render_system::RenderInfo(render_context.get())); m_renderer->render(render_system::RenderInfo(m_render_context.get())); m_device->end_scene(); m_device->present(); } void App::render_particle_system() { for(Size particle_n = 0; particle_n != m_particle_container->particles_count(); ++particle_n) { const Float x_coof = 2.0f; const Float y_coof = 1.5f; const float square_2 = 0.003f; math::Vector3F position = m_particle_position_accessor.attribute(m_particle_container->particle(particle_n)).position(); position.set(position.x() / x_coof, position.y() / y_coof, 0); SharedPtr test_shape(new render_system::QuadShape( math::Vector3F(position.x() - square_2, position.y() - square_2, 0.0f), math::Vector3F(position.x() + square_2, position.y() - square_2, 0.0f), math::Vector3F(position.x() + square_2, position.y() + square_2, 0.0f), math::Vector3F(position.x() - square_2, position.y() + square_2, 0.0f), image::Color4F(1.0f, 1.0f, 1.0f, 1.0f), m_render_context.get())); m_renderer->add_shape(test_shape); } } const SharedPtr& App::render_context() const { return m_render_context; } void App::on_change_mouse_position() { math::Vector3F gravity(zp_numeric_cast(m_mouse_x - 400), -zp_numeric_cast(m_mouse_y - 300), 0); gravity *= 1.0f / 100.0f; m_gravity_velocity_policy->set_gravity(gravity); } void App::set_mouse_x( Int x ) { m_mouse_x = x; on_change_mouse_position(); } void App::set_mouse_y( Int y ) { m_mouse_y = y; on_change_mouse_position(); } } // namespace zp_test } // namespace zp