void trace_system::spawn_finishing_traces_for_destroyed_objects(logic_step& step) const { auto& cosmos = step.cosm; const auto& events = step.transient.messages.get_queue<messages::will_soon_be_deleted>(); for (const auto& it : events) { const auto e = cosmos[it.subject]; const auto* const trace = e.find<components::trace>(); if (e.has<components::substance>() && trace && !trace->is_it_finishing_trace) { const auto finishing_trace = cosmos.create_entity("finishing_trace"); auto copied_trace = *trace; copied_trace.lengthening_time_passed_ms = 0.f; copied_trace.chosen_lengthening_duration_ms /= 4; copied_trace.is_it_finishing_trace = true; finishing_trace += copied_trace; finishing_trace += e.get<components::sprite>(); finishing_trace += e.logic_transform(); finishing_trace += e.get<components::render>(); //finishing_trace.get<components::transform>().rotation = 90;// e.get<components::physics>().velocity().degrees(); if (e.find<components::damage>()) { finishing_trace.get<components::transform>().pos = e.get<components::damage>().saved_point_of_impact_before_death - (e.get<components::sprite>().size/2).rotate(finishing_trace.get<components::transform>().rotation, vec2(0,0)) ; } finishing_trace.add_standard_components(); } } }
void spatial_properties_mixin<false, D>::set_logic_transform(const components::transform t) const { if (logic_transform() == t) { return; } const auto handle = *static_cast<const D*>(this); const auto owner = handle.get_owner_body(); bool is_only_fixtural = owner.alive() && owner != handle; ensure(!is_only_fixtural); if (handle.has<components::physics>()) { ensure(!handle.has<components::transform>()); const auto& phys = handle.get<components::physics>(); phys.set_transform(t); } else { handle.get<components::transform>() = t; if (handle.has<components::dynamic_tree_node>()) { handle.get<components::dynamic_tree_node>().update_proxy(); } } }
vec2 crosshair::calculate_aiming_displacement(const_entity_handle subject_crosshair, bool snap_epsilon_base_offset) { auto recoil_body = subject_crosshair[sub_entity_name::CROSSHAIR_RECOIL_BODY]; auto considered_base_offset = subject_crosshair.get<components::crosshair>().base_offset; if (snap_epsilon_base_offset && considered_base_offset.is_epsilon(4)) considered_base_offset.set(4, 0); considered_base_offset.rotate(recoil_body.logic_transform().rotation, vec2()); return considered_base_offset; }
components::transform basic_spatial_properties_mixin<C, D>::logic_transform() const { const auto handle = *static_cast<const D*>(this); const auto owner = handle.get_owner_body(); if (owner.alive() && owner != handle) { return components::fixtures::transform_around_body(handle, owner.logic_transform()); } else if (handle.has<components::physics>()) { ensure(!handle.has<components::transform>()); const auto& phys = handle.get<components::physics>(); return{ phys.get_position(), phys.get_angle() }; } else if (handle.has<components::wandering_pixels>()) { return handle.get<components::wandering_pixels>().reach.center(); } else { return handle.get<components::transform>(); } }
ltrb basic_renderable_mixin<C, D>::get_aabb(const renderable_positioning_type type) const { const auto handle = *static_cast<const D*>(this); return get_aabb(handle.logic_transform(), type); }