/******************************************************************************* * This file is part of the "Enduro2D" * For conditions of distribution and use, see copyright notice in LICENSE.md * Copyright (C) 2018 Matvey Cherevko ******************************************************************************/ #include "../common.hpp" using namespace e2d; namespace { struct rotator { v3f axis; }; class game_system final : public ecs::system { public: void process(ecs::registry& owner) override { E2D_UNUSED(owner); const keyboard& k = the().keyboard(); if ( k.is_key_just_released(keyboard_key::f12) ) { the().toggle_visible(!the().visible()); } if ( k.is_key_just_released(keyboard_key::escape) ) { the().set_should_close(true); } if ( k.is_key_pressed(keyboard_key::lsuper) && k.is_key_just_released(keyboard_key::enter) ) { the().toggle_fullscreen(!the().fullscreen()); } } }; class camera_system final : public ecs::system { public: void process(ecs::registry& owner) override { owner.for_joined_components( [](const ecs::const_entity&, camera& cam){ if ( !cam.target() ) { cam.viewport( the().real_size()); cam.projection(math::make_orthogonal_lh_matrix4( the().real_size().cast_to(), 0.f, 1000.f)); } }); } }; class rotator_system final : public ecs::system { public: void process(ecs::registry& owner) override { const f32 time = the().time(); owner.for_joined_components( [&time](const ecs::const_entity&, const rotator& rot, actor& act){ const node_iptr node = act.node(); if ( node ) { const q4f q = math::make_quat_from_axis_angle(make_rad(time), rot.axis); node->rotation(q); } }); } }; class game final : public high_application { public: bool initialize() final { return create_scene() && create_camera() && create_systems(); } private: bool create_scene() { auto model_res = the().load_asset("gnome_model.json"); auto model_mat = the().load_asset("gnome_material.json"); auto sprite_res = the().load_asset("ship_sprite.json"); auto sprite_mat = the().load_asset("sprite_material.json"); auto flipbook_res = the().load_asset("cube_flipbook.json"); if ( !model_res || !model_mat || !sprite_res || !sprite_mat || !flipbook_res ) { return false; } ecs::entity scene_e = the().registry().create_entity(); scene_e.assign_component(node::create(the())); node_iptr scene_r = scene_e.get_component().root(); { ecs::entity model_e = the().registry().create_entity(); ecs::entity_filler(model_e) .component(rotator{v3f::unit_y()}) .component(node::create(model_e, scene_r)) .component(renderer() .materials({model_mat})) .component(model_res); node_iptr model_n = model_e.get_component().node(); model_n->scale(v3f{20.f}); model_n->translation(v3f{0.f,50.f,0.f}); } { ecs::entity sprite_e = the().registry().create_entity(); ecs::entity_filler(sprite_e) .component(rotator{v3f::unit_z()}) .component(node::create(sprite_e, scene_r)) .component(renderer() .materials({sprite_mat})) .component(sprite_res); node_iptr sprite_n = sprite_e.get_component().node(); sprite_n->translation(v3f{0,-50.f,0}); } { for ( std::size_t i = 0; i < 2; ++i ) for ( std::size_t j = 0; j < 5; ++j ) { ecs::entity flipbook_e = the().registry().create_entity(); ecs::entity_filler(flipbook_e) .component(node::create(flipbook_e, scene_r)) .component(renderer() .materials({sprite_mat})) .component(sprite_renderer() .filtering(false)) .component(flipbook_res) .component(flipbook_player() .looped(true) .sequence("idle")); node_iptr flipbook_n = flipbook_e.get_component().node(); flipbook_n->scale(v3f(2.f,2.f,1.f)); flipbook_n->translation(v3f{-80.f + j * 40.f, -200.f + i * 40.f, 0}); } } return true; } bool create_camera() { ecs::entity camera_e = the().registry().create_entity(); ecs::entity_filler(camera_e) .component(camera() .background({1.f, 0.4f, 0.f, 1.f})) .component(node::create(camera_e)); return true; } bool create_systems() { ecs::registry_filler(the().registry()) .system(world::priority_update) .system(world::priority_update) .system(world::priority_pre_render); return true; } }; } int e2d_main(int argc, char *argv[]) { const auto starter_params = starter::parameters( engine::parameters("sample_03", "enduro2d") .timer_params(engine::timer_parameters() .maximal_framerate(100))); modules::initialize(argc, argv, starter_params).start(); modules::shutdown(); return 0; }