A 3D game engine from scratch.
at main 101 lines 2.5 kB view raw
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net> 2 3#include "logs.hpp" 4#include "behavior_functions.hpp" 5#include "behavior.hpp" 6#include "engine.hpp" 7#include "intrinsics.hpp" 8 9 10behavior::State *behavior::state = nullptr; 11 12 13behavior::Function behavior::function_map[(u32)Behavior::length] = { 14 (behavior::Function)nullptr, 15 (behavior::Function)behavior_functions::test, 16 (behavior::Function)behavior_functions::char_movement_test, 17}; 18 19 20char const * 21behavior::behavior_to_string(Behavior behavior) 22{ 23 if (behavior == Behavior::none) { 24 return "none"; 25 } else if (behavior == Behavior::test) { 26 return "test"; 27 } else if (behavior == Behavior::char_movement_test) { 28 return "char_movement_test"; 29 } else { 30 logs::error("Don't know how to convert Behavior to string: %d", behavior); 31 return "<unknown>"; 32 } 33} 34 35 36behavior::Behavior 37behavior::behavior_from_string(char const *str) 38{ 39 if (strcmp(str, "none") == 0) { 40 return Behavior::none; 41 } else if (strcmp(str, "test") == 0) { 42 return Behavior::test; 43 } else if (strcmp(str, "char_movement_test") == 0) { 44 return Behavior::char_movement_test; 45 } else { 46 logs::fatal("Could not parse Behavior: %s", str); 47 return Behavior::none; 48 } 49} 50 51 52bool 53behavior::is_behavior_component_valid(behavior::Component *behavior_component) 54{ 55 return behavior_component->behavior != Behavior::none; 56} 57 58 59void 60behavior::update() 61{ 62 each (behavior_component, *get_components()) { 63 if (!is_behavior_component_valid(behavior_component)) { 64 continue; 65 } 66 67 entities::Handle entity_handle = behavior_component->entity_handle; 68 69 auto handler = function_map[(u32)behavior_component->behavior]; 70 if (handler) { 71 handler(entity_handle); 72 } 73 } 74} 75 76 77Array<behavior::Component> * 78behavior::get_components() 79{ 80 return &behavior::state->components; 81} 82 83 84behavior::Component * 85behavior::get_component(entities::Handle entity_handle) 86{ 87 return behavior::state->components[entity_handle]; 88} 89 90 91void behavior::init( 92 behavior::State *behavior_state, 93 memory::Pool *asset_memory_pool, 94 ::State *state 95) { 96 behavior::state = behavior_state; 97 // NOTE: behavior needs the global state to pass to the behavior functions 98 behavior::state->state = state; 99 behavior::state->components = Array<behavior::Component>( 100 asset_memory_pool, MAX_N_ENTITIES, "behavior_components", true, 1); 101}