From 288012a4efae5681b712fa3ca94d2a5180a77c99 Mon Sep 17 00:00:00 2001 From: "C. J. Howard" Date: Thu, 15 Apr 2021 20:44:36 +0800 Subject: [PATCH] Make runnable again after multiple data module updates --- ...-component.hpp => ephemeris-component.hpp} | 13 +- src/ecs/components/light-component.hpp | 40 +++++ src/ecs/systems/astronomy-system.cpp | 32 +--- src/ecs/systems/astronomy-system.hpp | 16 +- src/ecs/systems/camera-system.cpp | 4 +- src/ecs/systems/render-system.cpp | 134 +++++++++++++++- src/ecs/systems/render-system.hpp | 12 +- src/ecs/systems/ui-system.cpp | 12 -- src/ecs/systems/ui-system.hpp | 2 - src/game/bootloader.cpp | 52 +++---- src/game/game-context.hpp | 2 - src/game/states/play-state.cpp | 144 ++++-------------- src/resources/model-loader.cpp | 7 +- 13 files changed, 249 insertions(+), 221 deletions(-) rename src/ecs/components/{render-component.hpp => ephemeris-component.hpp} (77%) create mode 100644 src/ecs/components/light-component.hpp diff --git a/src/ecs/components/render-component.hpp b/src/ecs/components/ephemeris-component.hpp similarity index 77% rename from src/ecs/components/render-component.hpp rename to src/ecs/components/ephemeris-component.hpp index 586c50c..f4577f3 100644 --- a/src/ecs/components/render-component.hpp +++ b/src/ecs/components/ephemeris-component.hpp @@ -17,19 +17,18 @@ * along with Antkeeper source code. If not, see . */ -#ifndef ANTKEEPER_ECS_RENDER_COMPONENT_HPP -#define ANTKEEPER_ECS_RENDER_COMPONENT_HPP +#ifndef ANTKEEPER_ECS_EPHEMERIS_COMPONENT_HPP +#define ANTKEEPER_ECS_EPHEMERIS_COMPONENT_HPP -#include "scene/object.hpp" +#include "astro/orbit.hpp" namespace ecs { -struct render_component +struct ephemeris_component { - scene::object_base* object; - unsigned int layers; + ecs::entity body; }; } // namespace ecs -#endif // ANTKEEPER_ECS_RENDER_COMPONENT_HPP +#endif // ANTKEEPER_ECS_EPHEMERIS_COMPONENT_HPP diff --git a/src/ecs/components/light-component.hpp b/src/ecs/components/light-component.hpp new file mode 100644 index 0000000..043cc5a --- /dev/null +++ b/src/ecs/components/light-component.hpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2021 Christopher J. Howard + * + * This file is part of Antkeeper source code. + * + * Antkeeper source code is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Antkeeper source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Antkeeper source code. If not, see . + */ + +#ifndef ANTKEEPER_ECS_LIGHT_COMPONENT_HPP +#define ANTKEEPER_ECS_LIGHT_COMPONENT_HPP + +#include "utility/fundamental-types.hpp" +#include "scene/light.hpp" + +namespace ecs { + +struct light_component +{ + scene::light_type type; + float3 color; + float intensity; + float3 attenuation; + float2 cutoff; +}; + +} // namespace ecs + +#endif // ANTKEEPER_ECS_LIGHT_COMPONENT_HPP + diff --git a/src/ecs/systems/astronomy-system.cpp b/src/ecs/systems/astronomy-system.cpp index 5a65e6d..6553bda 100644 --- a/src/ecs/systems/astronomy-system.cpp +++ b/src/ecs/systems/astronomy-system.cpp @@ -22,7 +22,6 @@ #include "astro/apparent-size.hpp" #include "ecs/components/celestial-body-component.hpp" #include "ecs/components/transform-component.hpp" -#include "renderer/passes/sky-pass.hpp" namespace ecs { @@ -35,9 +34,9 @@ astronomy_system::astronomy_system(ecs::registry& registry): observer_location{0.0, 0.0, 0.0}, lst(0.0), obliquity(0.0), - sky_pass(nullptr), - sun(entt::null), - moon(entt::null) + axial_rotation(0.0), + axial_rotation_at_epoch(0.0), + axial_rotation_speed(0.0) {} void astronomy_system::update(double t, double dt) @@ -71,15 +70,6 @@ void astronomy_system::update(double t, double dt) transform.local.rotation = math::type_cast(math::quaternion_cast(rotation)); transform.local.scale = math::type_cast(double3{body.radius, body.radius, body.radius}); }); - - if (sky_pass) - { - sky_pass->set_horizon_color({0, 0, 0}); - sky_pass->set_zenith_color({1, 1, 1}); - sky_pass->set_time_of_day(static_cast(universal_time * 60.0 * 60.0)); - //sky_pass->set_observer_location(location[0], location[1], location[2]); - sky_pass->set_julian_day(static_cast(universal_time)); - } } void astronomy_system::set_universal_time(double time) @@ -108,6 +98,7 @@ void astronomy_system::set_obliquity(double angle) void astronomy_system::set_axial_rotation_speed(double speed) { axial_rotation_speed = speed; + update_axial_rotation(); } void astronomy_system::set_axial_rotation_at_epoch(double angle) @@ -116,21 +107,6 @@ void astronomy_system::set_axial_rotation_at_epoch(double angle) update_axial_rotation(); } -void astronomy_system::set_sky_pass(::sky_pass* pass) -{ - this->sky_pass = pass; -} - -void astronomy_system::set_sun(ecs::entity entity) -{ - sun = entity; -} - -void astronomy_system::set_moon(ecs::entity entity) -{ - moon = entity; -} - void astronomy_system::update_axial_rotation() { axial_rotation = math::wrap_radians(axial_rotation_at_epoch + universal_time * axial_rotation_speed); diff --git a/src/ecs/systems/astronomy-system.hpp b/src/ecs/systems/astronomy-system.hpp index 23ae416..6d5f51b 100644 --- a/src/ecs/systems/astronomy-system.hpp +++ b/src/ecs/systems/astronomy-system.hpp @@ -24,8 +24,6 @@ #include "ecs/entity.hpp" #include "utility/fundamental-types.hpp" -class sky_pass; - namespace ecs { /** @@ -80,13 +78,13 @@ public: */ void set_axial_rotation_speed(double speed); + /** + * Sets the axial rotation of the observer's planet when the universal time is `0.0`. + * + * @param angle Axial rotation angle, in radians. + */ void set_axial_rotation_at_epoch(double angle); - void set_sky_pass(::sky_pass* pass); - - void set_sun(ecs::entity entity); - void set_moon(ecs::entity entity); - private: /// Updates the axial rotation angle void update_axial_rotation(); @@ -106,10 +104,6 @@ private: double3 observer_location; double obliquity; double3x3 ecliptic_to_horizontal; - sky_pass* sky_pass; - - entity sun; - entity moon; }; } // namespace ecs diff --git a/src/ecs/systems/camera-system.cpp b/src/ecs/systems/camera-system.cpp index 892a950..0445007 100644 --- a/src/ecs/systems/camera-system.cpp +++ b/src/ecs/systems/camera-system.cpp @@ -33,8 +33,8 @@ camera_system::camera_system(ecs::registry& registry): viewport{0, 0, 0, 0}, mouse_position{0, 0} { - orbit_cam.set_elevation_limits({math::radians(5.0f), math::radians(89.0f)}); - //orbit_cam.set_elevation_limits({math::radians(-89.0f), math::radians(89.0f)}); + //orbit_cam.set_elevation_limits({math::radians(5.0f), math::radians(89.0f)}); + orbit_cam.set_elevation_limits({math::radians(-89.0f), math::radians(89.0f)}); orbit_cam.set_focal_distance_limits({2.0f, 200.0f}); orbit_cam.set_fov_limits({math::radians(80.0f), math::radians(35.0f)}); orbit_cam.set_clip_near_limits({0.1f, 5.0f}); diff --git a/src/ecs/systems/render-system.cpp b/src/ecs/systems/render-system.cpp index ba92bce..a26906d 100644 --- a/src/ecs/systems/render-system.cpp +++ b/src/ecs/systems/render-system.cpp @@ -20,6 +20,11 @@ #include "render-system.hpp" #include "ecs/components/transform-component.hpp" #include "renderer/renderer.hpp" +#include "scene/point-light.hpp" +#include "scene/directional-light.hpp" +#include "scene/ambient-light.hpp" +#include "scene/spotlight.hpp" +#include namespace ecs { @@ -30,10 +35,15 @@ render_system::render_system(ecs::registry& registry): registry.on_construct().connect<&render_system::on_model_construct>(this); registry.on_replace().connect<&render_system::on_model_replace>(this); registry.on_destroy().connect<&render_system::on_model_destroy>(this); + + registry.on_construct().connect<&render_system::on_light_construct>(this); + registry.on_replace().connect<&render_system::on_light_replace>(this); + registry.on_destroy().connect<&render_system::on_light_destroy>(this); } void render_system::update(double t, double dt) { + // Update model instance transforms registry.view().each ( [this](ecs::entity entity, auto& transform, auto& model) @@ -41,7 +51,6 @@ void render_system::update(double t, double dt) scene::model_instance* instance = model_instances[entity]; instance->set_transform(transform.world); - if (transform.warp) { instance->get_transform_tween().update(); @@ -50,6 +59,23 @@ void render_system::update(double t, double dt) } } ); + + // Update light transforms + registry.view().each + ( + [this](ecs::entity entity, auto& transform, auto& light) + { + scene::light* light_object = lights[entity]; + + light_object->set_transform(transform.world); + if (transform.warp) + { + light_object->get_transform_tween().update(); + light_object->update_tweens(); + transform.warp = false; + } + } + ); } void render_system::render(double alpha) @@ -85,6 +111,13 @@ scene::model_instance* render_system::get_model_instance(ecs::entity entity) return nullptr; } +scene::light* render_system::get_light(ecs::entity entity) +{ + if (auto it = lights.find(entity); it != lights.end()) + return it->second; + return nullptr; +} + void render_system::update_model_and_materials(ecs::entity entity, model_component& model) { if (auto model_it = model_instances.find(entity); model_it != model_instances.end()) @@ -110,6 +143,38 @@ void render_system::update_model_and_materials(ecs::entity entity, model_compone } } +void render_system::update_light(ecs::entity entity, ecs::light_component& component) +{ + if (auto light_it = lights.find(entity); light_it != lights.end()) + { + scene::light* light = light_it->second; + + light->set_color(component.color); + light->set_intensity(component.intensity); + + switch (light->get_light_type()) + { + case scene::light_type::point: + { + scene::point_light* point = static_cast(light); + point->set_attenuation(component.attenuation); + break; + } + + case scene::light_type::spot: + { + scene::spotlight* spot = static_cast(light); + spot->set_attenuation(component.attenuation); + spot->set_cutoff(component.cutoff); + break; + } + + default: + break; + } + } +} + void render_system::on_model_construct(ecs::registry& registry, ecs::entity entity, model_component& model) { scene::model_instance* model_instance = new scene::model_instance(); @@ -126,14 +191,69 @@ void render_system::on_model_destroy(ecs::registry& registry, ecs::entity entity { if (auto it = model_instances.find(entity); it != model_instances.end()) { - // Remove model instance from all layers - for (std::size_t i = 0; i < layers.size(); ++i) - { - layers[i]->remove_object(it->second); - } + scene::model_instance* model_instance = it->second; - delete it->second; + // Remove model instance from all layers + for (scene::collection* layer: layers) + layer->remove_object(model_instance); + model_instances.erase(it); + delete model_instance; + } +} + +void render_system::on_light_construct(ecs::registry& registry, ecs::entity entity, light_component& component) +{ + scene::light* light = nullptr; + + switch (component.type) + { + case scene::light_type::ambient: + light = new scene::ambient_light(); + break; + + case scene::light_type::directional: + light = new scene::directional_light(); + break; + + case scene::light_type::point: + light = new scene::point_light(); + break; + + case scene::light_type::spot: + light = new scene::spotlight(); + break; + + default: + break; + } + + if (light) + { + lights[entity] = light; + for (scene::collection* layer: layers) + layer->add_object(light); + + update_light(entity, component); + } +} + +void render_system::on_light_replace(ecs::registry& registry, ecs::entity entity, light_component& light) +{ + update_light(entity, light); +} + +void render_system::on_light_destroy(ecs::registry& registry, ecs::entity entity) +{ + if (auto it = lights.find(entity); it != lights.end()) + { + scene::light* light = it->second; + + for (scene::collection* layer: layers) + layer->remove_object(light); + + lights.erase(it); + delete light; } } diff --git a/src/ecs/systems/render-system.hpp b/src/ecs/systems/render-system.hpp index 730867f..f65c731 100644 --- a/src/ecs/systems/render-system.hpp +++ b/src/ecs/systems/render-system.hpp @@ -23,8 +23,9 @@ #include "entity-system.hpp" #include "scene/collection.hpp" #include "scene/model-instance.hpp" +#include "scene/light.hpp" #include "ecs/components/model-component.hpp" -#include "ecs/components/render-component.hpp" +#include "ecs/components/light-component.hpp" #include "ecs/entity.hpp" #include #include @@ -48,21 +49,24 @@ public: void set_renderer(::renderer* renderer); scene::model_instance* get_model_instance(ecs::entity entity); + scene::light* get_light(ecs::entity entity); private: void update_model_and_materials(ecs::entity entity, ecs::model_component& model); + void update_light(ecs::entity entity, ecs::light_component& component); void on_model_construct(ecs::registry& registry, ecs::entity entity, ecs::model_component& model); void on_model_replace(ecs::registry& registry, ecs::entity entity, ecs::model_component& model); void on_model_destroy(ecs::registry& registry, ecs::entity entity); - void on_component_construct(ecs::registry& registry, ecs::entity entity, ecs::render_component& component); - void on_component_replace(ecs::registry& registry, ecs::entity entity, ecs::render_component& component); - void on_component_destroy(ecs::registry& registry, ecs::entity entity); + void on_light_construct(ecs::registry& registry, ecs::entity entity, ecs::light_component& light); + void on_light_replace(ecs::registry& registry, ecs::entity entity, ecs::light_component& light); + void on_light_destroy(ecs::registry& registry, ecs::entity entity); renderer* renderer; std::vector layers; std::unordered_map model_instances; + std::unordered_map lights; }; } // namespace ecs diff --git a/src/ecs/systems/ui-system.cpp b/src/ecs/systems/ui-system.cpp index c43f857..fa99bf5 100644 --- a/src/ecs/systems/ui-system.cpp +++ b/src/ecs/systems/ui-system.cpp @@ -47,17 +47,10 @@ ui_system::ui_system(::resource_manager* resource_manager): tool_selector_bg.set_translation({0, 0, -4.0f}); tool_selector_bg.set_scale({270, 270, 270}); - // Setup energy symbol - energy_symbol.set_model(resource_manager->load("energy.mdl")); - energy_symbol.set_scale({30, 30, 30}); - energy_symbol.update_tweens(); - energy_symbol.set_active(false); - // Setup scene //scene.add_object(&camera); //scene.add_object(&indirect_light); //scene.add_object(&direct_light); - //scene.add_object(&energy_symbol); } void ui_system::update(float dt) @@ -72,11 +65,6 @@ void ui_system::set_viewport(const float4& viewport) viewport_center[1] = (viewport[3] - viewport[1]) * 0.5f; - - - energy_symbol.set_translation({viewport[2] * 0.25f, 0.0f, 0.0f}); - energy_symbol.update_tweens(); - // Resize modal BG modal_bg.set_scale({viewport[2] * 0.5f, viewport[3] * 0.5f, 1.0f}); modal_bg.update_tweens(); diff --git a/src/ecs/systems/ui-system.hpp b/src/ecs/systems/ui-system.hpp index abd2728..94228da 100644 --- a/src/ecs/systems/ui-system.hpp +++ b/src/ecs/systems/ui-system.hpp @@ -75,8 +75,6 @@ private: scene::billboard underground_bg; - scene::model_instance energy_symbol; - float2 mouse_position; float4 viewport; float2 viewport_center; diff --git a/src/game/bootloader.cpp b/src/game/bootloader.cpp index ce1aeb7..28ee2bb 100644 --- a/src/game/bootloader.cpp +++ b/src/game/bootloader.cpp @@ -609,7 +609,7 @@ void setup_rendering(game_context* ctx) void setup_scenes(game_context* ctx) { debug::logger* logger = ctx->logger; - logger->push_task("Setting up rendering"); + logger->push_task("Setting up scenes"); // Get default framebuffer const auto& viewport_dimensions = ctx->rasterizer->get_default_framebuffer().get_dimensions(); @@ -639,14 +639,6 @@ void setup_scenes(game_context* ctx) ctx->ui_camera->set_compositor(ctx->ui_compositor); // Setup lights - ctx->sun_indirect = new scene::ambient_light(); - ctx->sun_indirect->set_intensity(0.0f); - ctx->sun_indirect->update_tweens(); - - ctx->sun_direct = new scene::directional_light(); - ctx->sun_direct->set_intensity(0.0f); - ctx->sun_direct->update_tweens(); - ctx->moon_light = new scene::directional_light(); ctx->moon_light->set_intensity(0.0f); ctx->moon_light->update_tweens(); @@ -707,9 +699,7 @@ void setup_scenes(game_context* ctx) // Setup overworld scene ctx->overworld_scene = new scene::collection(); ctx->overworld_scene->add_object(ctx->overworld_camera); - ctx->overworld_scene->add_object(ctx->sun_indirect); - ctx->overworld_scene->add_object(ctx->sun_direct); - ctx->overworld_scene->add_object(ctx->moon_light); + //ctx->overworld_scene->add_object(ctx->moon_light); //ctx->overworld_scene->add_object(ctx->spotlight); // Setup underworld scene @@ -726,7 +716,7 @@ void setup_scenes(game_context* ctx) ctx->ui_scene = new scene::collection(); ctx->ui_scene->add_object(ctx->ui_camera); - ctx->overworld_scene->add_object(ctx->lens_spotlight); + //ctx->overworld_scene->add_object(ctx->lens_spotlight); ctx->underworld_scene->add_object(ctx->flashlight_spotlight); // Set overworld as active scene @@ -809,12 +799,12 @@ void setup_systems(game_context* ctx) ctx->terrain_system->set_patch_size(TERRAIN_PATCH_SIZE); // Setup vegetation system - ctx->vegetation_system = new ecs::vegetation_system(*ctx->ecs_registry); - ctx->vegetation_system->set_terrain_patch_size(TERRAIN_PATCH_SIZE); - ctx->vegetation_system->set_vegetation_patch_resolution(VEGETATION_PATCH_RESOLUTION); - ctx->vegetation_system->set_vegetation_density(1.0f); - ctx->vegetation_system->set_vegetation_model(ctx->resource_manager->load("grass-tuft.mdl")); - ctx->vegetation_system->set_scene(ctx->overworld_scene); + //ctx->vegetation_system = new ecs::vegetation_system(*ctx->ecs_registry); + //ctx->vegetation_system->set_terrain_patch_size(TERRAIN_PATCH_SIZE); + //ctx->vegetation_system->set_vegetation_patch_resolution(VEGETATION_PATCH_RESOLUTION); + //ctx->vegetation_system->set_vegetation_density(1.0f); + //ctx->vegetation_system->set_vegetation_model(ctx->resource_manager->load("grass-tuft.mdl")); + //ctx->vegetation_system->set_scene(ctx->overworld_scene); // Setup camera system ctx->camera_system = new ecs::camera_system(*ctx->ecs_registry); @@ -885,7 +875,6 @@ void setup_systems(game_context* ctx) // Setup astronomy system ctx->astronomy_system = new ecs::astronomy_system(*ctx->ecs_registry); - ctx->astronomy_system->set_sky_pass(ctx->overworld_sky_pass); // Set time scale float time_scale = 60.0f; @@ -1145,8 +1134,6 @@ void setup_controls(game_context* ctx) } ); - - ctx->control_system->get_next_marker_control()->set_activated_callback ( [ctx]() @@ -1193,9 +1180,9 @@ void setup_controls(game_context* ctx) ( [ctx, time_scale]() { - ctx->weather_system->set_time_scale(time_scale * 50.0f); - ctx->solar_system->set_time_scale(time_scale * 50.0f); - ctx->astronomy_system->set_time_scale(time_scale * 50.0f); + ctx->weather_system->set_time_scale(time_scale * 500.0f); + ctx->solar_system->set_time_scale(time_scale * 500.0f); + ctx->astronomy_system->set_time_scale(time_scale * 500.0f); } ); ctx->control_system->get_fast_forward_control()->set_deactivated_callback @@ -1211,9 +1198,9 @@ void setup_controls(game_context* ctx) ( [ctx, time_scale]() { - ctx->weather_system->set_time_scale(time_scale * -50.0f); - ctx->solar_system->set_time_scale(time_scale * -50.0f); - ctx->astronomy_system->set_time_scale(time_scale * -50.0f); + ctx->weather_system->set_time_scale(time_scale * -500.0f); + ctx->solar_system->set_time_scale(time_scale * -500.0f); + ctx->astronomy_system->set_time_scale(time_scale * -500.0f); } ); ctx->control_system->get_rewind_control()->set_deactivated_callback @@ -1267,7 +1254,7 @@ void setup_callbacks(game_context* ctx) ctx->control_system->update(t, dt); ctx->terrain_system->update(t, dt); - ctx->vegetation_system->update(t, dt); + //ctx->vegetation_system->update(t, dt); ctx->snapping_system->update(t, dt); ctx->nest_system->update(t, dt); ctx->subterrain_system->update(t, dt); @@ -1278,18 +1265,19 @@ void setup_callbacks(game_context* ctx) ctx->camera_system->update(t, dt); ctx->tool_system->update(t, dt); + ctx->solar_system->update(t, dt); + ctx->astronomy_system->update(t, dt); ctx->spatial_system->update(t, dt); ctx->constraint_system->update(t, dt); ctx->tracking_system->update(t, dt); ctx->painting_system->update(t, dt); ctx->weather_system->update(t, dt); - ctx->solar_system->update(t, dt); - ctx->astronomy_system->update(t, dt); + //(*ctx->focal_point_tween)[1] = ctx->orbit_cam->get_focal_point(); auto xf = ecs::command::get_world_transform(*ctx->ecs_registry, ctx->lens_entity); - ctx->lens_spotlight->look_at(xf.translation, xf.translation + ctx->sun_direct->get_direction(), {0, 1, 0}); + //ctx->lens_spotlight->look_at(xf.translation, xf.translation + ctx->sun_direct->get_direction(), {0, 1, 0}); xf = ecs::command::get_world_transform(*ctx->ecs_registry, ctx->flashlight_entity); //ctx->flashlight_spotlight->set_transform(xf); diff --git a/src/game/game-context.hpp b/src/game/game-context.hpp index 13b708d..d8579f4 100644 --- a/src/game/game-context.hpp +++ b/src/game/game-context.hpp @@ -185,8 +185,6 @@ struct game_context scene::camera* overworld_camera; scene::camera* underworld_camera; scene::camera* ui_camera; - scene::ambient_light* sun_indirect; - scene::directional_light* sun_direct; scene::directional_light* moon_light; scene::point_light* subterrain_light; scene::ambient_light* underworld_ambient_light; diff --git a/src/game/states/play-state.cpp b/src/game/states/play-state.cpp index f723cc1..b653f6c 100644 --- a/src/game/states/play-state.cpp +++ b/src/game/states/play-state.cpp @@ -33,6 +33,8 @@ #include "ecs/components/transform-component.hpp" #include "ecs/components/camera-follow-component.hpp" #include "ecs/components/orbit-component.hpp" +#include "ecs/components/celestial-body-component.hpp" +#include "ecs/components/light-component.hpp" #include "ecs/commands.hpp" #include "game/game-context.hpp" #include "game/states/game-states.hpp" @@ -44,13 +46,13 @@ #include "gl/texture-wrapping.hpp" #include "renderer/model.hpp" #include "renderer/passes/sky-pass.hpp" +#include "renderer/passes/shadow-map-pass.hpp" #include "resources/resource-manager.hpp" #include "scene/model-instance.hpp" #include "scene/collection.hpp" #include "scene/camera.hpp" #include "scene/ambient-light.hpp" #include "scene/directional-light.hpp" -#include "scene/directional-light.hpp" #include "ecs/systems/control-system.hpp" #include "ecs/systems/camera-system.hpp" #include "ecs/systems/render-system.hpp" @@ -81,7 +83,7 @@ void play_state_enter(game_context* ctx) } else { - ctx->biome = ctx->resource_manager->load("grassland.bio"); + ctx->biome = ctx->resource_manager->load("forest.bio"); } // Apply biome parameters to scene @@ -90,6 +92,31 @@ void play_state_enter(game_context* ctx) sky_pass->set_sky_model(ctx->resource_manager->load("sky-dome.mdl")); sky_pass->set_moon_model(ctx->resource_manager->load("moon.mdl")); + sky_pass->set_horizon_color({1.0f, 1.0f, 1.0f}); + sky_pass->set_zenith_color({0.0f, 0.0f, 0.0f}); + sky_pass->set_time_of_day(0.0f); + sky_pass->set_julian_day(0.0f); + sky_pass->set_observer_location(ctx->biome->location[0], ctx->biome->location[1], 0.0f); + sky_pass->set_moon_angular_radius(math::radians(1.0f)); + sky_pass->set_sun_angular_radius(math::radians(1.0f)); + + + + scene::ambient_light* ambient = new scene::ambient_light(); + ambient->set_color({1, 1, 1}); + ambient->set_intensity(0.1f); + ambient->update_tweens(); + ctx->overworld_scene->add_object(ambient); + + scene::directional_light* sun = new scene::directional_light(); + sun->set_color({1, 1, 1}); + sun->set_intensity(4.0f); + sun->look_at({0, 1, 1}, {0, 0, 0}, {0, 1, 0}); + sun->update_tweens(); + ctx->overworld_scene->add_object(sun); + ctx->overworld_shadow_map_pass->set_light(sun); + + ctx->weather_system->set_universal_time(0.0); ctx->solar_system->set_universal_time(0.0); @@ -103,71 +130,9 @@ void play_state_enter(game_context* ctx) resource_manager* resource_manager = ctx->resource_manager; entt::registry& ecs_registry = *ctx->ecs_registry; - ctx->sun_direct->set_intensity(1.0f); - ctx->sun_direct->set_color({1, 1, 1}); - - - // Create sun - { - ecs::orbit_component sun_orbit; - sun_orbit.elements.a = 1.0; - sun_orbit.elements.ec = 0.016709; - sun_orbit.elements.w = math::radians(282.9404); - sun_orbit.elements.ma = math::radians(356.0470); - sun_orbit.elements.i = 0.0; - sun_orbit.elements.om = 0.0; - - sun_orbit.rate.a = 0.0; - sun_orbit.rate.ec = -1.151e-9; - sun_orbit.rate.w = math::radians(4.70935e-5); - sun_orbit.rate.ma = math::radians(0.9856002585); - sun_orbit.rate.i = 0.0; - sun_orbit.rate.om = 0.0; - - ecs::transform_component sun_transform; - sun_transform.local = math::identity_transform; - sun_transform.warp = true; - - auto sun_entity = ecs_registry.create(); - ecs_registry.assign(sun_entity, sun_transform); - ecs_registry.assign(sun_entity, sun_orbit); - - ctx->astronomy_system->set_sun(sun_entity); - } - - // Create moon - { - - ecs::orbit_component moon_orbit; - - moon_orbit.elements.a = 0.00256955529; - moon_orbit.elements.ec = 0.0554; - moon_orbit.elements.w = math::radians(318.15); - moon_orbit.elements.ma = math::radians(135.27); - moon_orbit.elements.i = math::radians(5.16); - moon_orbit.elements.om = math::radians(125.08); - - moon_orbit.rate.a = 0.0; - moon_orbit.rate.ec = 0.0; - moon_orbit.rate.w = math::radians(0.1643573223); // Argument of periapsis precession period, P_w - moon_orbit.rate.ma = math::radians(13.176358); // Longitude rate, n - moon_orbit.rate.i = 0.0; - moon_orbit.rate.om = math::radians(-18.6 / 365.2422); // Longitude of the ascending node precession period, P_node - - ecs::transform_component moon_transform; - moon_transform.local = math::identity_transform; - moon_transform.warp = true; - - auto moon_entity = ecs_registry.create(); - ecs_registry.assign(moon_entity, moon_transform); - ecs_registry.assign(moon_entity, moon_orbit); - - ctx->astronomy_system->set_moon(moon_entity); - } // Load entity archetypes ecs::archetype* ant_hill_archetype = resource_manager->load("ant-hill.ent"); - ecs::archetype* maple_tree_archetype = resource_manager->load("maple-tree.ent"); ecs::archetype* nest_archetype = resource_manager->load("harvester-nest.ent"); ecs::archetype* samara_archetype = resource_manager->load("samara.ent"); ecs::archetype* forceps_archetype = resource_manager->load("forceps.ent"); @@ -176,14 +141,10 @@ void play_state_enter(game_context* ctx) ecs::archetype* marker_archetype = resource_manager->load("marker.ent"); ecs::archetype* container_archetype = resource_manager->load("container.ent"); ecs::archetype* twig_archetype = resource_manager->load("twig.ent"); - ecs::archetype* larva_archetype = resource_manager->load("larva.ent"); - ecs::archetype* pebble_archetype = resource_manager->load("pebble.ent"); + ecs::archetype* larva_archetype = resource_manager->load("ant-larva.ent"); ecs::archetype* flashlight_archetype = resource_manager->load("flashlight.ent"); ecs::archetype* flashlight_light_cone_archetype = resource_manager->load("flashlight-light-cone.ent"); ecs::archetype* lens_light_cone_archetype = resource_manager->load("lens-light-cone.ent"); - ecs::archetype* ant_head_archetype = resource_manager->load("ant-head.ent"); - ecs::archetype* dandelion_plant_archetype = resource_manager->load("dandelion-plant.ent"); - ecs::archetype* grassland_road_archetype = resource_manager->load("grassland-road.ent"); // Create tools forceps_archetype->assign(ecs_registry, ctx->forceps_entity); @@ -198,6 +159,7 @@ void play_state_enter(game_context* ctx) auto flashlight_light_cone = flashlight_light_cone_archetype->create(ecs_registry); ecs::command::parent(ecs_registry, flashlight_light_cone, ctx->flashlight_entity); ecs::command::assign_render_layers(ecs_registry, ctx->flashlight_entity, 2); + ecs::command::assign_render_layers(ecs_registry, flashlight_light_cone, 2); // Make lens tool's model instance unculled, so its shadow is always visible. scene::model_instance* lens_model_instance = ctx->render_system->get_model_instance(ctx->lens_entity); @@ -211,8 +173,6 @@ void play_state_enter(game_context* ctx) //ecs::command::bind_transform(ecs_registry, lens_light_cone, ctx->lens_entity); ecs::command::parent(ecs_registry, lens_light_cone, ctx->lens_entity); - - // Hide inactive tools ecs::command::assign_render_layers(ecs_registry, ctx->forceps_entity, 0); ecs::command::assign_render_layers(ecs_registry, ctx->brush_entity, 0); @@ -223,46 +183,10 @@ void play_state_enter(game_context* ctx) // Activate brush tool ctx->tool_system->set_active_tool(ctx->brush_entity); - - // Create background - for (int i = 0; i < 4; ++i) - { - auto road_entity = grassland_road_archetype->create(ecs_registry); - auto& transform = ecs_registry.get(road_entity); - - math::quaternion rotation = math::angle_axis(math::half_pi * static_cast(i), float3{0, 1, 0}); - float3 translation = rotation * float3{0, 0, 1600.0f}; - - transform.local = math::identity_transform; - transform.local.rotation = rotation; - transform.local.translation = translation; - } // Create ant-hill auto ant_hill_entity = ant_hill_archetype->create(ecs_registry); ecs::command::place(ecs_registry, ant_hill_entity, {0, 0}); - - // Generate pebbles - float pebble_radius = 300.0f; - int pebble_count = 20; - for (int i = 0; i < pebble_count; ++i) - { - float x = math::random(-pebble_radius, pebble_radius); - float z = math::random(-pebble_radius, pebble_radius); - - auto pebble_entity = ant_head_archetype->create(ecs_registry); - - auto& transform = ecs_registry.get(pebble_entity); - transform.local = math::identity_transform; - transform.local.rotation = math::angle_axis(math::random(0.0f, math::two_pi), {0, 1, 0}); - transform.local.scale = float3{1, 1, 1} * math::random(0.75f, 1.25f); - - ecs::command::place(ecs_registry, pebble_entity, {x, z}); - } - - // Create maple tree - //auto maple_tree_entity = maple_tree_archetype->create(ecs_registry); - //ecs::command::place(ecs_registry, maple_tree_entity, {300, 200}); // Creat nest auto nest_entity = nest_archetype->create(ecs_registry); @@ -320,9 +244,6 @@ void play_state_enter(game_context* ctx) ctx->overworld_camera->look_at({0, 0, 1}, {0, 0, 0}, {0, 1, 0}); ctx->camera_system->set_camera(ctx->overworld_camera); - auto ant_head = ant_head_archetype->create(ecs_registry); - ecs::command::place(ecs_registry, ant_head, {50, 0}); - ctx->overworld_scene->update_tweens(); // Allocate a nest @@ -389,9 +310,6 @@ void play_state_enter(game_context* ctx) //transform.transform.translation.y -= 1.0f; } - auto dandelion_plant = dandelion_plant_archetype->create(ecs_registry); - ecs::command::place(ecs_registry, dandelion_plant, {55, -30}); - ecs::control_system* control_system = ctx->control_system; control_system->update(0.0, 0.0); control_system->set_nest(nest); diff --git a/src/resources/model-loader.cpp b/src/resources/model-loader.cpp index e6a4635..aff36ad 100644 --- a/src/resources/model-loader.cpp +++ b/src/resources/model-loader.cpp @@ -512,7 +512,12 @@ model* resource_loader::load(resource_manager* resource_manager, PHYSFS_F if (auto size_node = material_node.value().find("size"); size_node != material_node.value().end()) group_size = size_node.value().get(); - group_material = resource_manager->load(group_name + ".mtl"); + // Slugify material filename + std::string material_filename = group_name + ".mtl"; + std::replace(material_filename.begin(), material_filename.end(), '_', '-'); + + // Load material from file + group_material = resource_manager->load(material_filename); model_group* model_group = model->add_group(group_name); model_group->set_drawing_mode(gl::drawing_mode::triangles);