Trying more examples
This commit is contained in:
parent
18616b3578
commit
175155ed5d
206
raylib_3dexample1/core_3d_camera_first_person.c
Normal file
206
raylib_3dexample1/core_3d_camera_first_person.c
Normal file
@ -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;
|
||||||
|
}
|
169
raylib_3dexample1/models_loading.c
Normal file
169
raylib_3dexample1/models_loading.c
Normal file
@ -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;
|
||||||
|
}
|
171
raylib_3dexample1/models_loading2.c
Normal file
171
raylib_3dexample1/models_loading2.c
Normal file
@ -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
|
1
renderer1/.gitignore
vendored
Normal file
1
renderer1/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
renderer1
|
11
renderer1/go.mod
Normal file
11
renderer1/go.mod
Normal file
@ -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
|
||||||
|
)
|
8
renderer1/go.sum
Normal file
8
renderer1/go.sum
Normal file
@ -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=
|
21
renderer1/main.go
Normal file
21
renderer1/main.go
Normal file
@ -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()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user