From 175155ed5dd19304437b7223da12b48ceff73e70 Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Tue, 30 Jul 2024 19:14:28 -0400 Subject: [PATCH] Trying more examples --- .../core_3d_camera_first_person.c | 206 ++++++++++++++++++ raylib_3dexample1/models_loading.c | 169 ++++++++++++++ raylib_3dexample1/models_loading2.c | 171 +++++++++++++++ renderer1/.gitignore | 1 + renderer1/go.mod | 11 + renderer1/go.sum | 8 + renderer1/main.go | 21 ++ 7 files changed, 587 insertions(+) create mode 100644 raylib_3dexample1/core_3d_camera_first_person.c create mode 100644 raylib_3dexample1/models_loading.c create mode 100644 raylib_3dexample1/models_loading2.c create mode 100644 renderer1/.gitignore create mode 100644 renderer1/go.mod create mode 100644 renderer1/go.sum create mode 100644 renderer1/main.go diff --git a/raylib_3dexample1/core_3d_camera_first_person.c b/raylib_3dexample1/core_3d_camera_first_person.c new file mode 100644 index 0000000..35b18ac --- /dev/null +++ b/raylib_3dexample1/core_3d_camera_first_person.c @@ -0,0 +1,206 @@ +/******************************************************************************************* +* +* raylib [core] example - 3d camera first person +* +* Example originally created with raylib 1.3, last time updated with raylib 1.3 +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2015-2024 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" +#include "rcamera.h" + +#define MAX_COLUMNS 20 + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person"); + + // Define the camera to look into our 3d world (position, target, up vector) + Camera camera = { 0 }; + camera.position = (Vector3){ 0.0f, 2.0f, 4.0f }; // Camera position + camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; // Camera looking at point + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) + camera.fovy = 60.0f; // Camera field-of-view Y + camera.projection = CAMERA_PERSPECTIVE; // Camera projection type + + int cameraMode = CAMERA_FIRST_PERSON; + + // Generates some random columns + float heights[MAX_COLUMNS] = { 0 }; + Vector3 positions[MAX_COLUMNS] = { 0 }; + Color colors[MAX_COLUMNS] = { 0 }; + + for (int i = 0; i < MAX_COLUMNS; i++) + { + heights[i] = (float)GetRandomValue(1, 12); + positions[i] = (Vector3){ (float)GetRandomValue(-15, 15), heights[i]/2.0f, (float)GetRandomValue(-15, 15) }; + colors[i] = (Color){ GetRandomValue(20, 255), GetRandomValue(10, 55), 30, 255 }; + } + + DisableCursor(); // Limit cursor to relative movement inside the window + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // Switch camera mode + if (IsKeyPressed(KEY_ONE)) + { + cameraMode = CAMERA_FREE; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll + } + + if (IsKeyPressed(KEY_TWO)) + { + cameraMode = CAMERA_FIRST_PERSON; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll + } + + if (IsKeyPressed(KEY_THREE)) + { + cameraMode = CAMERA_THIRD_PERSON; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll + } + + if (IsKeyPressed(KEY_FOUR)) + { + cameraMode = CAMERA_ORBITAL; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Reset roll + } + + // Switch camera projection + if (IsKeyPressed(KEY_P)) + { + if (camera.projection == CAMERA_PERSPECTIVE) + { + // Create isometric view + cameraMode = CAMERA_THIRD_PERSON; + // Note: The target distance is related to the render distance in the orthographic projection + camera.position = (Vector3){ 0.0f, 2.0f, -100.0f }; + camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; + camera.projection = CAMERA_ORTHOGRAPHIC; + camera.fovy = 20.0f; // near plane width in CAMERA_ORTHOGRAPHIC + CameraYaw(&camera, -135 * DEG2RAD, true); + CameraPitch(&camera, -45 * DEG2RAD, true, true, false); + } + else if (camera.projection == CAMERA_ORTHOGRAPHIC) + { + // Reset to default view + cameraMode = CAMERA_THIRD_PERSON; + camera.position = (Vector3){ 0.0f, 2.0f, 10.0f }; + camera.target = (Vector3){ 0.0f, 2.0f, 0.0f }; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; + camera.projection = CAMERA_PERSPECTIVE; + camera.fovy = 60.0f; + } + } + + // Update camera computes movement internally depending on the camera mode + // Some default standard keyboard/mouse inputs are hardcoded to simplify use + // For advance camera controls, it's reecommended to compute camera movement manually + UpdateCamera(&camera, cameraMode); // Update camera + +/* + // Camera PRO usage example (EXPERIMENTAL) + // This new camera function allows custom movement/rotation values to be directly provided + // as input parameters, with this approach, rcamera module is internally independent of raylib inputs + UpdateCameraPro(&camera, + (Vector3){ + (IsKeyDown(KEY_W) || IsKeyDown(KEY_UP))*0.1f - // Move forward-backward + (IsKeyDown(KEY_S) || IsKeyDown(KEY_DOWN))*0.1f, + (IsKeyDown(KEY_D) || IsKeyDown(KEY_RIGHT))*0.1f - // Move right-left + (IsKeyDown(KEY_A) || IsKeyDown(KEY_LEFT))*0.1f, + 0.0f // Move up-down + }, + (Vector3){ + GetMouseDelta().x*0.05f, // Rotation: yaw + GetMouseDelta().y*0.05f, // Rotation: pitch + 0.0f // Rotation: roll + }, + GetMouseWheelMove()*2.0f); // Move to target (zoom) +*/ + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + DrawPlane((Vector3){ 0.0f, 0.0f, 0.0f }, (Vector2){ 32.0f, 32.0f }, LIGHTGRAY); // Draw ground + DrawCube((Vector3){ -16.0f, 2.5f, 0.0f }, 1.0f, 5.0f, 32.0f, BLUE); // Draw a blue wall + DrawCube((Vector3){ 16.0f, 2.5f, 0.0f }, 1.0f, 5.0f, 32.0f, LIME); // Draw a green wall + DrawCube((Vector3){ 0.0f, 2.5f, 16.0f }, 32.0f, 5.0f, 1.0f, GOLD); // Draw a yellow wall + + // Draw some cubes around + for (int i = 0; i < MAX_COLUMNS; i++) + { + DrawCube(positions[i], 2.0f, heights[i], 2.0f, colors[i]); + DrawCubeWires(positions[i], 2.0f, heights[i], 2.0f, MAROON); + } + + // Draw player cube + if (cameraMode == CAMERA_THIRD_PERSON) + { + DrawCube(camera.target, 0.5f, 0.5f, 0.5f, PURPLE); + DrawCubeWires(camera.target, 0.5f, 0.5f, 0.5f, DARKPURPLE); + } + + EndMode3D(); + + // Draw info boxes + DrawRectangle(5, 5, 330, 100, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines(5, 5, 330, 100, BLUE); + + DrawText("Camera controls:", 15, 15, 10, BLACK); + DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, BLACK); + DrawText("- Look around: arrow keys or mouse", 15, 45, 10, BLACK); + DrawText("- Camera mode keys: 1, 2, 3, 4", 15, 60, 10, BLACK); + DrawText("- Zoom keys: num-plus, num-minus or mouse scroll", 15, 75, 10, BLACK); + DrawText("- Camera projection key: P", 15, 90, 10, BLACK); + + DrawRectangle(600, 5, 195, 100, Fade(SKYBLUE, 0.5f)); + DrawRectangleLines(600, 5, 195, 100, BLUE); + + DrawText("Camera status:", 610, 15, 10, BLACK); + DrawText(TextFormat("- Mode: %s", (cameraMode == CAMERA_FREE) ? "FREE" : + (cameraMode == CAMERA_FIRST_PERSON) ? "FIRST_PERSON" : + (cameraMode == CAMERA_THIRD_PERSON) ? "THIRD_PERSON" : + (cameraMode == CAMERA_ORBITAL) ? "ORBITAL" : "CUSTOM"), 610, 30, 10, BLACK); + DrawText(TextFormat("- Projection: %s", (camera.projection == CAMERA_PERSPECTIVE) ? "PERSPECTIVE" : + (camera.projection == CAMERA_ORTHOGRAPHIC) ? "ORTHOGRAPHIC" : "CUSTOM"), 610, 45, 10, BLACK); + DrawText(TextFormat("- Position: (%06.3f, %06.3f, %06.3f)", camera.position.x, camera.position.y, camera.position.z), 610, 60, 10, BLACK); + DrawText(TextFormat("- Target: (%06.3f, %06.3f, %06.3f)", camera.target.x, camera.target.y, camera.target.z), 610, 75, 10, BLACK); + DrawText(TextFormat("- Up: (%06.3f, %06.3f, %06.3f)", camera.up.x, camera.up.y, camera.up.z), 610, 90, 10, BLACK); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/raylib_3dexample1/models_loading.c b/raylib_3dexample1/models_loading.c new file mode 100644 index 0000000..bde2550 --- /dev/null +++ b/raylib_3dexample1/models_loading.c @@ -0,0 +1,169 @@ +/******************************************************************************************* + * + * raylib [models] example - Models loading + * + * NOTE: raylib supports multiple models file formats: + * + * - OBJ > Text file format. Must include vertex position-texcoords-normals + *information, if files references some .mtl materials file, it will be loaded + *(or try to). + * - GLTF > Text/binary file format. Includes lot of information and it + *could also reference external files, raylib will try loading mesh and + *materials data. + * - IQM > Binary file format. Includes mesh vertex data but also animation + *data, raylib can load .iqm animations. + * - VOX > Binary file format. MagikaVoxel mesh format: + * https://github.com/ephtracy/voxel-model/blob/master/MagicaVoxel-file-format-vox.txt + * - M3D > Binary file format. Model 3D format: + * https://bztsrc.gitlab.io/model3d + * + * Example originally created with raylib 2.0, last time updated with + *raylib 4.2 + * + * Example licensed under an unmodified zlib/libpng license, which is an + *OSI-certified, BSD-like license that allows static linking with closed source + *software + * + * Copyright (c) 2014-2024 Ramon Santamaria (@raysan5) + * + ********************************************************************************************/ + +#include "raylib.h" + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) { + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, + "raylib [models] example - models loading"); + + // Define the camera to look into our 3d world + Camera camera = {0}; + camera.position = (Vector3){50.0f, 50.0f, 50.0f}; // Camera position + camera.target = (Vector3){0.0f, 10.0f, 0.0f}; // Camera looking at point + camera.up = + (Vector3){0.0f, 1.0f, 0.0f}; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y + camera.projection = CAMERA_PERSPECTIVE; // Camera mode type + + Model model = LoadModel("resources/models/obj/castle.obj"); // Load model + Texture2D texture = LoadTexture( + "resources/models/obj/castle_diffuse.png"); // Load model texture + model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = + texture; // Set map diffuse texture + + Vector3 position = {0.0f, 0.0f, 0.0f}; // Set model position + + BoundingBox bounds = GetMeshBoundingBox(model.meshes[0]); // Set model bounds + + // NOTE: bounds are calculated from the original size of the model, + // if model is scaled on drawing, bounds must be also scaled + + bool selected = false; // Selected object flag + + DisableCursor(); // Limit cursor to relative movement inside the window + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera, CAMERA_FIRST_PERSON); + + // Load new models/textures on drag&drop + if (IsFileDropped()) { + FilePathList droppedFiles = LoadDroppedFiles(); + + if (droppedFiles.count == 1) // Only support one file dropped + { + if (IsFileExtension(droppedFiles.paths[0], ".obj") || + IsFileExtension(droppedFiles.paths[0], ".gltf") || + IsFileExtension(droppedFiles.paths[0], ".glb") || + IsFileExtension(droppedFiles.paths[0], ".vox") || + IsFileExtension(droppedFiles.paths[0], ".iqm") || + IsFileExtension(droppedFiles.paths[0], + ".m3d")) // Model file formats supported + { + UnloadModel(model); // Unload previous model + model = LoadModel(droppedFiles.paths[0]); // Load new model + model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = + texture; // Set current map diffuse texture + + bounds = GetMeshBoundingBox(model.meshes[0]); + + // TODO: Move camera position from target enough distance to visualize + // model properly + } else if (IsFileExtension(droppedFiles.paths[0], + ".png")) // Texture file formats supported + { + // Unload current model texture and load new one + UnloadTexture(texture); + texture = LoadTexture(droppedFiles.paths[0]); + model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; + } + } + + UnloadDroppedFiles(droppedFiles); // Unload filepaths from memory + } + + // Select model on mouse click + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + // Check collision between ray and box + if (GetRayCollisionBox(GetScreenToWorldRay(GetMousePosition(), camera), + bounds) + .hit) + selected = !selected; + else + selected = false; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + DrawModel(model, position, 1.0f, WHITE); // Draw 3d model with texture + + DrawGrid(20, 10.0f); // Draw a grid + + if (selected) + DrawBoundingBox(bounds, GREEN); // Draw selection box + + EndMode3D(); + + DrawText("Drag & drop model to load mesh/texture.", 10, + GetScreenHeight() - 20, 10, DARKGRAY); + if (selected) + DrawText("MODEL SELECTED", GetScreenWidth() - 110, 10, 10, GREEN); + + DrawText("(c) Castle 3D model by Alberto Cano", screenWidth - 200, + screenHeight - 20, 10, GRAY); + + DrawFPS(10, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadTexture(texture); // Unload texture + UnloadModel(model); // Unload model + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/raylib_3dexample1/models_loading2.c b/raylib_3dexample1/models_loading2.c new file mode 100644 index 0000000..30502fb --- /dev/null +++ b/raylib_3dexample1/models_loading2.c @@ -0,0 +1,171 @@ +/******************************************************************************************* + * + * raylib [models] example - Models loading + * + * NOTE: raylib supports multiple models file formats: + * + * - OBJ > Text file format. Must include vertex position-texcoords-normals + *information, if files references some .mtl materials file, it will be loaded + *(or try to). + * - GLTF > Text/binary file format. Includes lot of information and it + *could also reference external files, raylib will try loading mesh and + *materials data. + * - IQM > Binary file format. Includes mesh vertex data but also animation + *data, raylib can load .iqm animations. + * - VOX > Binary file format. MagikaVoxel mesh format: + * https://github.com/ephtracy/voxel-model/blob/master/MagicaVoxel-file-format-vox.txt + * - M3D > Binary file format. Model 3D format: + * https://bztsrc.gitlab.io/model3d + * + * Example originally created with raylib 2.0, last time updated with + *raylib 4.2 + * + * Example licensed under an unmodified zlib/libpng license, which is an + *OSI-certified, BSD-like license that allows static linking with closed source + *software + * + * Copyright (c) 2014-2024 Ramon Santamaria (@raysan5) + * + ********************************************************************************************/ + +#include "raylib.h" + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) { + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, + "raylib [models] example - models loading"); + + // Define the camera to look into our 3d world + Camera camera = {0}; + camera.position = (Vector3){50.0f, 50.0f, 50.0f}; // Camera position + camera.target = (Vector3){0.0f, 10.0f, 0.0f}; // Camera looking at point + camera.up = + (Vector3){0.0f, 1.0f, 0.0f}; // Camera up vector (rotation towards target) + camera.fovy = 45.0f; // Camera field-of-view Y + camera.projection = CAMERA_PERSPECTIVE; // Camera mode type + + Model model = LoadModel("resources/models/obj/castle.obj"); // Load model + Texture2D texture = LoadTexture( + "resources/models/obj/castle_diffuse.png"); // Load model texture + model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = + texture; // Set map diffuse texture + + Vector3 position = {0.0f, 0.0f, 0.0f}; // Set model position + + BoundingBox bounds = GetMeshBoundingBox(model.meshes[0]); // Set model bounds + + // NOTE: bounds are calculated from the original size of the model, + // if model is scaled on drawing, bounds must be also scaled + + bool selected = false; // Selected object flag + + DisableCursor(); // Limit cursor to relative movement inside the window + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera, CAMERA_FIRST_PERSON); + + // Load new models/textures on drag&drop + if (IsFileDropped()) { + FilePathList droppedFiles = LoadDroppedFiles(); + + if (droppedFiles.count == 1) // Only support one file dropped + { + if (IsFileExtension(droppedFiles.paths[0], ".obj") || + IsFileExtension(droppedFiles.paths[0], ".gltf") || + IsFileExtension(droppedFiles.paths[0], ".glb") || + IsFileExtension(droppedFiles.paths[0], ".vox") || + IsFileExtension(droppedFiles.paths[0], ".iqm") || + IsFileExtension(droppedFiles.paths[0], + ".m3d")) // Model file formats supported + { + UnloadModel(model); // Unload previous model + model = LoadModel(droppedFiles.paths[0]); // Load new model + model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = + texture; // Set current map diffuse texture + + bounds = GetMeshBoundingBox(model.meshes[0]); + + // TODO: Move camera position from target enough distance to visualize + // model properly + } else if (IsFileExtension(droppedFiles.paths[0], + ".png")) // Texture file formats supported + { + // Unload current model texture and load new one + UnloadTexture(texture); + texture = LoadTexture(droppedFiles.paths[0]); + model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; + } + } + + UnloadDroppedFiles(droppedFiles); // Unload filepaths from memory + } + + // Select model on mouse click + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + // Check collision between ray and box + if (GetRayCollisionBox(GetScreenToWorldRay(GetMousePosition(), camera), + bounds) + .hit) + selected = !selected; + else + selected = false; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + DrawModel(model, position, 1.0f, WHITE); // Draw 3d model with texture + + DrawGrid(20, 10.0f); // Draw a grid + + if (selected) + DrawBoundingBox(bounds, GREEN); // Draw selection box + + EndMode3D(); + + DrawText("Drag & drop model to load mesh/texture.", 10, + GetScreenHeight() - 20, 10, DARKGRAY); + if (selected) + DrawText("MODEL SELECTED", GetScreenWidth() - 110, 10, 10, GREEN); + + DrawText("(c) Castle 3D model by Alberto Cano", screenWidth - 200, + screenHeight - 20, 10, GRAY); + + DrawFPS(10, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadTexture(texture); // Unload texture + UnloadModel(model); // Unload model + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +// raylib example source code diff --git a/renderer1/.gitignore b/renderer1/.gitignore new file mode 100644 index 0000000..ed57ae7 --- /dev/null +++ b/renderer1/.gitignore @@ -0,0 +1 @@ +renderer1 diff --git a/renderer1/go.mod b/renderer1/go.mod new file mode 100644 index 0000000..693692a --- /dev/null +++ b/renderer1/go.mod @@ -0,0 +1,11 @@ +module renderer1 + +go 1.22.5 + +require github.com/gen2brain/raylib-go/raylib v0.0.0-20240628125141-62016ee92fc0 + +require ( + github.com/ebitengine/purego v0.7.1 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/sys v0.20.0 // indirect +) diff --git a/renderer1/go.sum b/renderer1/go.sum new file mode 100644 index 0000000..d39cac3 --- /dev/null +++ b/renderer1/go.sum @@ -0,0 +1,8 @@ +github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA= +github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/gen2brain/raylib-go/raylib v0.0.0-20240628125141-62016ee92fc0 h1:mhWZabwn9WvzqMBgiuW8ewuQ4Zg+PfW+XbNnTtIX1FY= +github.com/gen2brain/raylib-go/raylib v0.0.0-20240628125141-62016ee92fc0/go.mod h1:BaY76bZk7nw1/kVOSQObPY1v1iwVE1KHAGMfvI6oK1Q= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/renderer1/main.go b/renderer1/main.go new file mode 100644 index 0000000..9868f30 --- /dev/null +++ b/renderer1/main.go @@ -0,0 +1,21 @@ +package main + +import ( + rl "github.com/gen2brain/raylib-go/raylib" +) + +func main() { + rl.InitWindow(800, 450, "raylib [core] example - basic window") + defer rl.CloseWindow() + + rl.SetTargetFPS(60) + + for !rl.WindowShouldClose() { + rl.BeginDrawing() + + rl.ClearBackground(rl.RayWhite) + rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LightGray) + + rl.EndDrawing() + } +}