| @ -0,0 +1,389 @@ | |||
| /******************************************************************************************* | |||
| * | |||
| * raylib [rlgl] example - Using rlgl module as standalone module | |||
| * | |||
| * NOTE: This example requires OpenGL 3.3 or ES2 versions for shaders support, | |||
| * OpenGL 1.1 does not support shaders but it can also be used. | |||
| * | |||
| * Compile rlgl module using: | |||
| * gcc -c rlgl.c -Wall -std=c99 -DRLGL_STANDALONE -DRAYMATH_IMPLEMENTATION -DGRAPHICS_API_OPENGL_33 | |||
| * | |||
| * Compile example using: | |||
| * gcc -o $(NAME_PART).exe $(FILE_NAME) rlgl.o -lglfw3 -lopengl32 -lgdi32 -std=c99 | |||
| * | |||
| * This example has been created using raylib 1.5 (www.raylib.com) | |||
| * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | |||
| * | |||
| * Copyright (c) 2015 Ramon Santamaria (@raysan5) | |||
| * | |||
| ********************************************************************************************/ | |||
| #include <GLFW/glfw3.h> // Windows/Context and inputs management | |||
| #define RLGL_STANDALONE | |||
| #include "rlgl.h" // rlgl library: OpenGL 1.1 immediate-mode style coding | |||
| #define RED (Color){ 230, 41, 55, 255 } // Red | |||
| #define RAYWHITE (Color){ 245, 245, 245, 255 } // My own White (raylib logo) | |||
| #define DARKGRAY (Color){ 80, 80, 80, 255 } // Dark Gray | |||
| //---------------------------------------------------------------------------------- | |||
| // Module specific Functions Declaration | |||
| //---------------------------------------------------------------------------------- | |||
| static void ErrorCallback(int error, const char* description); | |||
| static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); | |||
| // Drawing functions (uses rlgl functionality) | |||
| static void DrawGrid(int slices, float spacing); | |||
| static void DrawCube(Vector3 position, float width, float height, float length, Color color); | |||
| static void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); | |||
| static void DrawRectangleV(Vector2 position, Vector2 size, Color color); | |||
| //---------------------------------------------------------------------------------- | |||
| // Main Entry point | |||
| //---------------------------------------------------------------------------------- | |||
| int main(void) | |||
| { | |||
| // Initialization | |||
| //-------------------------------------------------------------------------------------- | |||
| const int screenWidth = 800; | |||
| const int screenHeight = 450; | |||
| // GLFW3 Initialization + OpenGL 3.3 Context + Extensions | |||
| //-------------------------------------------------------- | |||
| glfwSetErrorCallback(ErrorCallback); | |||
| if (!glfwInit()) | |||
| { | |||
| TraceLog(WARNING, "GLFW3: Can not initialize GLFW"); | |||
| return 1; | |||
| } | |||
| else TraceLog(INFO, "GLFW3: GLFW initialized successfully"); | |||
| glfwWindowHint(GLFW_SAMPLES, 4); | |||
| glfwWindowHint(GLFW_DEPTH_BITS, 16); | |||
| glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | |||
| glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | |||
| glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |||
| glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); | |||
| GLFWwindow *window = glfwCreateWindow(screenWidth, screenHeight, "rlgl standalone", NULL, NULL); | |||
| if (!window) | |||
| { | |||
| glfwTerminate(); | |||
| return 2; | |||
| } | |||
| else TraceLog(INFO, "GLFW3: Window created successfully"); | |||
| glfwSetWindowPos(window, 200, 200); | |||
| glfwSetKeyCallback(window, KeyCallback); | |||
| glfwMakeContextCurrent(window); | |||
| glfwSwapInterval(1); | |||
| // Initialize supported extensions | |||
| rlglLoadExtensions(glfwGetProcAddress); | |||
| //-------------------------------------------------------- | |||
| // Initialize OpenGL context (states and resources) | |||
| rlglInit(screenWidth, screenHeight); | |||
| // Initialize viewport and internal projection/modelview matrices | |||
| rlViewport(0, 0, screenWidth, screenHeight); | |||
| rlMatrixMode(RL_PROJECTION); // Switch to PROJECTION matrix | |||
| rlLoadIdentity(); // Reset current matrix (PROJECTION) | |||
| rlOrtho(0, screenWidth, screenHeight, 0, 0.0f, 1.0f); // Orthographic projection with top-left corner at (0,0) | |||
| rlMatrixMode(RL_MODELVIEW); // Switch back to MODELVIEW matrix | |||
| rlLoadIdentity(); // Reset current matrix (MODELVIEW) | |||
| rlClearColor(245, 245, 245, 255); // Define clear color | |||
| rlEnableDepthTest(); // Enable DEPTH_TEST for 3D | |||
| Vector3 cubePosition = { 0.0f, 0.0f, 0.0f }; // Cube default position (center) | |||
| Camera camera; | |||
| camera.position = (Vector3){ 5.0f, 5.0f, 5.0f }; // Camera position | |||
| camera.target = (Vector3){ 0.0f, 0.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 | |||
| //-------------------------------------------------------------------------------------- | |||
| // Main game loop | |||
| while (!glfwWindowShouldClose(window)) | |||
| { | |||
| // Update | |||
| //---------------------------------------------------------------------------------- | |||
| // ... | |||
| //---------------------------------------------------------------------------------- | |||
| // Draw | |||
| //---------------------------------------------------------------------------------- | |||
| rlClearScreenBuffers(); // Clear current framebuffer | |||
| // Calculate projection matrix (from perspective) and view matrix from camera look at | |||
| Matrix matProj = MatrixPerspective(camera.fovy, (double)screenWidth/(double)screenHeight, 0.01, 1000.0); | |||
| MatrixTranspose(&matProj); | |||
| Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up); | |||
| SetMatrixModelview(matView); // Replace internal modelview matrix by a custom one | |||
| SetMatrixProjection(matProj); // Replace internal projection matrix by a custom one | |||
| DrawCube(cubePosition, 2.0f, 2.0f, 2.0f, RED); | |||
| DrawCubeWires(cubePosition, 2.0f, 2.0f, 2.0f, RAYWHITE); | |||
| DrawGrid(10, 1.0f); | |||
| // NOTE: Internal buffers drawing (3D data) | |||
| rlglDraw(); | |||
| // Draw '2D' elements in the scene (GUI) | |||
| #define RLGL_CREATE_MATRIX_MANUALLY | |||
| #if defined(RLGL_CREATE_MATRIX_MANUALLY) | |||
| matProj = MatrixOrtho(0.0, screenWidth, screenHeight, 0.0, 0.0, 1.0); | |||
| MatrixTranspose(&matProj); | |||
| matView = MatrixIdentity(); | |||
| SetMatrixModelview(matView); // Replace internal modelview matrix by a custom one | |||
| SetMatrixProjection(matProj); // Replace internal projection matrix by a custom one | |||
| #else // Let rlgl generate and multiply matrix internally | |||
| rlMatrixMode(RL_PROJECTION); // Enable internal projection matrix | |||
| rlLoadIdentity(); // Reset internal projection matrix | |||
| rlOrtho(0.0, screenWidth, screenHeight, 0.0, 0.0, 1.0); // Recalculate internal projection matrix | |||
| rlMatrixMode(RL_MODELVIEW); // Enable internal modelview matrix | |||
| rlLoadIdentity(); // Reset internal modelview matrix | |||
| #endif | |||
| DrawRectangleV((Vector2){ 10.0f, 10.0f }, (Vector2){ 780.0f, 20.0f }, DARKGRAY); | |||
| // NOTE: Internal buffers drawing (2D data) | |||
| rlglDraw(); | |||
| glfwSwapBuffers(window); | |||
| glfwPollEvents(); | |||
| //---------------------------------------------------------------------------------- | |||
| } | |||
| // De-Initialization | |||
| //-------------------------------------------------------------------------------------- | |||
| rlglClose(); // Unload rlgl internal buffers and default shader/texture | |||
| glfwDestroyWindow(window); | |||
| glfwTerminate(); | |||
| //-------------------------------------------------------------------------------------- | |||
| return 0; | |||
| } | |||
| //---------------------------------------------------------------------------------- | |||
| // Module specific Functions Definitions | |||
| //---------------------------------------------------------------------------------- | |||
| // GLFW3: Error callback | |||
| static void ErrorCallback(int error, const char* description) | |||
| { | |||
| TraceLog(ERROR, description); | |||
| } | |||
| // GLFW3: Keyboard callback | |||
| static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) | |||
| { | |||
| if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) | |||
| { | |||
| glfwSetWindowShouldClose(window, GL_TRUE); | |||
| } | |||
| } | |||
| // Draw rectangle using rlgl OpenGL 1.1 style coding (translated to OpenGL 3.3 internally) | |||
| static void DrawRectangleV(Vector2 position, Vector2 size, Color color) | |||
| { | |||
| rlBegin(RL_TRIANGLES); | |||
| rlColor4ub(color.r, color.g, color.b, color.a); | |||
| rlVertex2i(position.x, position.y); | |||
| rlVertex2i(position.x, position.y + size.y); | |||
| rlVertex2i(position.x + size.x, position.y + size.y); | |||
| rlVertex2i(position.x, position.y); | |||
| rlVertex2i(position.x + size.x, position.y + size.y); | |||
| rlVertex2i(position.x + size.x, position.y); | |||
| rlEnd(); | |||
| } | |||
| // Draw a grid centered at (0, 0, 0) | |||
| static void DrawGrid(int slices, float spacing) | |||
| { | |||
| int halfSlices = slices / 2; | |||
| rlBegin(RL_LINES); | |||
| for(int i = -halfSlices; i <= halfSlices; i++) | |||
| { | |||
| if (i == 0) | |||
| { | |||
| rlColor3f(0.5f, 0.5f, 0.5f); | |||
| rlColor3f(0.5f, 0.5f, 0.5f); | |||
| rlColor3f(0.5f, 0.5f, 0.5f); | |||
| rlColor3f(0.5f, 0.5f, 0.5f); | |||
| } | |||
| else | |||
| { | |||
| rlColor3f(0.75f, 0.75f, 0.75f); | |||
| rlColor3f(0.75f, 0.75f, 0.75f); | |||
| rlColor3f(0.75f, 0.75f, 0.75f); | |||
| rlColor3f(0.75f, 0.75f, 0.75f); | |||
| } | |||
| rlVertex3f((float)i*spacing, 0.0f, (float)-halfSlices*spacing); | |||
| rlVertex3f((float)i*spacing, 0.0f, (float)halfSlices*spacing); | |||
| rlVertex3f((float)-halfSlices*spacing, 0.0f, (float)i*spacing); | |||
| rlVertex3f((float)halfSlices*spacing, 0.0f, (float)i*spacing); | |||
| } | |||
| rlEnd(); | |||
| } | |||
| // Draw cube | |||
| // NOTE: Cube position is the center position | |||
| void DrawCube(Vector3 position, float width, float height, float length, Color color) | |||
| { | |||
| float x = 0.0f; | |||
| float y = 0.0f; | |||
| float z = 0.0f; | |||
| rlPushMatrix(); | |||
| // NOTE: Be careful! Function order matters (rotate -> scale -> translate) | |||
| rlTranslatef(position.x, position.y, position.z); | |||
| //rlScalef(2.0f, 2.0f, 2.0f); | |||
| //rlRotatef(45, 0, 1, 0); | |||
| rlBegin(RL_TRIANGLES); | |||
| rlColor4ub(color.r, color.g, color.b, color.a); | |||
| // Front Face ----------------------------------------------------- | |||
| rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right | |||
| // Back Face ------------------------------------------------------ | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right | |||
| rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left | |||
| // Top Face ------------------------------------------------------- | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Bottom Left | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Bottom Right | |||
| rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Bottom Right | |||
| // Bottom Face ---------------------------------------------------- | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right | |||
| rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Top Right | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left | |||
| // Right face ----------------------------------------------------- | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right | |||
| rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Left | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Left | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Left | |||
| // Left Face ------------------------------------------------------ | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Right | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Right | |||
| rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Right | |||
| rlEnd(); | |||
| rlPopMatrix(); | |||
| } | |||
| // Draw cube wires | |||
| void DrawCubeWires(Vector3 position, float width, float height, float length, Color color) | |||
| { | |||
| float x = 0.0f; | |||
| float y = 0.0f; | |||
| float z = 0.0f; | |||
| rlPushMatrix(); | |||
| rlTranslatef(position.x, position.y, position.z); | |||
| //rlRotatef(45, 0, 1, 0); | |||
| rlBegin(RL_LINES); | |||
| rlColor4ub(color.r, color.g, color.b, color.a); | |||
| // Front Face ----------------------------------------------------- | |||
| // Bottom Line | |||
| rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right | |||
| // Left Line | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Bottom Right | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right | |||
| // Top Line | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left | |||
| // Right Line | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left | |||
| rlVertex3f(x-width/2, y-height/2, z+length/2); // Bottom Left | |||
| // Back Face ------------------------------------------------------ | |||
| // Bottom Line | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right | |||
| // Left Line | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Bottom Right | |||
| rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right | |||
| // Top Line | |||
| rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left | |||
| // Right Line | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Bottom Left | |||
| // Top Face ------------------------------------------------------- | |||
| // Left Line | |||
| rlVertex3f(x-width/2, y+height/2, z+length/2); // Top Left Front | |||
| rlVertex3f(x-width/2, y+height/2, z-length/2); // Top Left Back | |||
| // Right Line | |||
| rlVertex3f(x+width/2, y+height/2, z+length/2); // Top Right Front | |||
| rlVertex3f(x+width/2, y+height/2, z-length/2); // Top Right Back | |||
| // Bottom Face --------------------------------------------------- | |||
| // Left Line | |||
| rlVertex3f(x-width/2, y-height/2, z+length/2); // Top Left Front | |||
| rlVertex3f(x-width/2, y-height/2, z-length/2); // Top Left Back | |||
| // Right Line | |||
| rlVertex3f(x+width/2, y-height/2, z+length/2); // Top Right Front | |||
| rlVertex3f(x+width/2, y-height/2, z-length/2); // Top Right Back | |||
| rlEnd(); | |||
| rlPopMatrix(); | |||
| } | |||