#include "raylib.h" #include "player_controller.h" #include "camera_controller.h" #include "city_generator.h" #include "core/input.h" #include "core/camera_node.h" #include "core/engine_global.h" #include "core/engine_loop.h" #include "core/scene.h" #include "core/transform_node.h" #include "core/mesh_render_entity.h" #include "utils/debug.h" #include "utils/mirror.h" //! Create camera node with a transformable parent. SceneNode *CreateCameraScene() { SceneNode *camera_parent = CreateTransformNode(); SceneNode *camera_transform = CreateTransformNode(); SceneNodeAddChild(camera_parent, camera_transform); SceneNodeAddChild(camera_transform, CreateCameraNode()); // set camera parent offset Transformable transformable = TC_CAST(camera_transform->entity, Transformable); Transform transform = transformable.tc->get_transform(transformable.data); transform.translation = (Vector3){-0.2f, 0.5f, -1.5f}; transform.rotation = QuaternionFromEuler(7.5f * DEG2RAD, 0.f, 0.f); transformable.tc->set_transform(transformable.data, transform); return camera_parent; } //! create a model with a camera attached as a child of the root of the scene. SceneNode *CreateModelScene() { SceneNode *model_parent = CreateTransformNode(); // create the rest of the scene with a mesh and a functionality node SceneNodeAddChild(model_parent, CreateMeshRenderEntity("rider")); SceneNodeAddChild(model_parent, CreatePlayerController()); // move the renderer's parent transform Transformable transformable = TC_CAST(model_parent->entity, Transformable); Transform transform = transformable.tc->get_global_transform(transformable.data); transform.translation.x = 10.f; transform.translation.y = 10.f; transformable.tc->set_global_transform(transformable.data, transform); return model_parent; } Scene *CreateInitialScene() { SceneNode *root = CreateTransformNode(); SceneNode *model = CreateModelScene(); SceneNode *camera_scene = CreateCameraScene(); SceneNodeAddChild(root, model); SceneNodeAddChild(root, camera_scene); SceneNodeAddChild(camera_scene, CreateCameraController(TC_CAST(model->entity, Transformable))); SceneNodeAddChild(root, GenerateCity()); return CreateScene(root); } void ConfigureInput() { AddAction("pitch_up", INPUT_LISTENER_KEY, 0, KEY_S); AddAction("pitch_down", INPUT_LISTENER_KEY, 0, KEY_W); AddAction("roll_left", INPUT_LISTENER_KEY, 0, KEY_A); AddAction("roll_right", INPUT_LISTENER_KEY, 0, KEY_D); AddAction("yaw_right", INPUT_LISTENER_KEY, 0, KEY_E); AddAction("yaw_left", INPUT_LISTENER_KEY, 0, KEY_Q); AddAction("brake", INPUT_LISTENER_KEY, 0, KEY_SPACE); AddAction("boost", INPUT_LISTENER_KEY, 0, KEY_LEFT_SHIFT); } int main() { InitializeEngine(); ConfigureInput(); RunGame(CreateInitialScene()); UNREACHABLE("main: End of main function reached. This is an error, call ShutDown() when exiting instead."); }