From 4817ab46f355f3a2b56b5f78be0f55cb41012206 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 21 Sep 2021 22:20:48 +0200 Subject: [PATCH] Add function DrawCubeTextureRec --- examples/models/models_cube_texture_region.c | 74 +++++++++ examples/models/resources/sheet.png | Bin 0 -> 355 bytes src/models.c | 161 ++++++++++++++++++- src/raylib.h | 1 + 4 files changed, 231 insertions(+), 5 deletions(-) create mode 100644 examples/models/models_cube_texture_region.c create mode 100644 examples/models/resources/sheet.png diff --git a/examples/models/models_cube_texture_region.c b/examples/models/models_cube_texture_region.c new file mode 100644 index 000000000..2e2cd748d --- /dev/null +++ b/examples/models/models_cube_texture_region.c @@ -0,0 +1,74 @@ +/******************************************************************************************* +* +* raylib [core] example - Draw cube with texture regions +* +* This example has been created using raylib 4.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2021 Timon de Groot (@tdgroot) and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d cube texture region"); + + // Define the camera to look into our 3d world + Camera3D camera = { 0 }; + camera.position = (Vector3){ 10.0f, 10.0f, 10.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 + camera.projection = CAMERA_PERSPECTIVE; // Camera mode type + + SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode + + // Load texture and define texture regions + Texture2D texture = LoadTexture("resources/sheet.png"); // Load texture sheet + Rectangle sprite1 = (Rectangle){ 0.0f, 0.0f, 32.0f, 32.0f }; // Define texture region for sprite 1 + Rectangle sprite2 = (Rectangle){ 32.0f, 0.0f, 32.0f, 32.0f }; // Define texture region for sprite 2 + + 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); // Update camera + + if (IsKeyDown('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + DrawCubeTextureRec(texture, sprite1, (Vector3){4.0f, 0.0f, -1.0f }, 2.0f, 2.0f, 2.0f, WHITE); + DrawCubeTextureRec(texture, sprite2, (Vector3){-4.0f, 0.0f, 1.0f }, 2.0f, 2.0f, 2.0f, BLUE); + + EndMode3D(); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/models/resources/sheet.png b/examples/models/resources/sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..a0dbd7e923ff1452c1a160172eeda67f8cd1e40e GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4uCLY*0oMfpx_Tr7srqc=eIKt@-`drxZVZI^0drou(jC0 z5YG4JumjHo)~MrM`V$3sMILqhU(z8VDF11`fX4bl8T%;{x8<%}wJP9lcX3||^Q>i@ z+ux-|ioM#^w=8o~)x7kbalZGz7s<9Y-ZQE;P~%zgIx5TenU?UQf3J5PVhCo__-~fD zTAnAtM{2Ke>P~)Jj9Tye={UFfgyMbqt~30tWR7#30)=*mb3OS zG0#vkKcN1;-Txl{+Wv-ehJDO(eE(Pv{nzopr07A5f=l}o! literal 0 HcmV?d00001 diff --git a/src/models.c b/src/models.c index b8221498a..ef50c9ade 100644 --- a/src/models.c +++ b/src/models.c @@ -9,7 +9,7 @@ * #define SUPPORT_FILEFORMAT_IQM * #define SUPPORT_FILEFORMAT_GLTF * #define SUPPORT_FILEFORMAT_VOX -* +* * Selected desired fileformats to be supported for model data loading. * * #define SUPPORT_MESH_GENERATION @@ -464,6 +464,157 @@ void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float hei rlSetTexture(0); } +void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color) +{ + float x = position.x; + float y = position.y; + float z = position.z; + float texture_width = (float)texture.width; + float texture_height = (float)texture.height; + + rlCheckRenderBatchLimit(36); + + rlSetTexture(texture.id); + + rlBegin(RL_QUADS); + rlColor4ub(color.r, color.g, color.b, color.a); + + // Front Face + { + // Normal Pointing Towards Viewer + rlNormal3f(0.0f, 0.0f, 1.0f); + + // Bottom Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x - width/2, y - height/2, z + length/2); + + // Bottom Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x + width/2, y - height/2, z + length/2); + + // Top Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, source.y / texture_height); + rlVertex3f(x + width/2, y + height/2, z + length/2); + + // Top Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, source.y / texture_height); + rlVertex3f(x - width/2, y + height/2, z + length/2); + } + + // Back Face + { + // Normal Pointing Away From Viewer + rlNormal3f(0.0f, 0.0f, - 1.0f); + + // Bottom Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x - width/2, y - height/2, z - length/2); + + // Top Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, source.y / texture_height); + rlVertex3f(x - width/2, y + height/2, z - length/2); + + // Top Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, source.y / texture_height); + rlVertex3f(x + width/2, y + height/2, z - length/2); + + // Bottom Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x + width/2, y - height/2, z - length/2); + } + + // Top Face + { + // Normal Pointing Up + rlNormal3f(0.0f, 1.0f, 0.0f); + + // Top Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, source.y / texture_height); + rlVertex3f(x - width/2, y + height/2, z - length/2); + + // Bottom Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x - width/2, y + height/2, z + length/2); + + // Bottom Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x + width/2, y + height/2, z + length/2); + + // Top Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, source.y / texture_height); + rlVertex3f(x + width/2, y + height/2, z - length/2); + } + + // Bottom Face + { + // Normal Pointing Down + rlNormal3f(0.0f, - 1.0f, 0.0f); + + // Top Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, source.y / texture_height); + rlVertex3f(x - width/2, y - height/2, z - length/2); + + // Top Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, source.y / texture_height); + rlVertex3f(x + width/2, y - height/2, z - length/2); + + // Bottom Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x + width/2, y - height/2, z + length/2); + + // Bottom Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x - width/2, y - height/2, z + length/2); + } + + // Right face + { + // Normal Pointing Right + rlNormal3f(1.0f, 0.0f, 0.0f); + + // Bottom Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x + width/2, y - height/2, z - length/2); + + // Top Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, source.y / texture_height); + rlVertex3f(x + width/2, y + height/2, z - length/2); + + // Top Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, source.y / texture_height); + rlVertex3f(x + width/2, y + height/2, z + length/2); + + // Bottom Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x + width/2, y - height/2, z + length/2); + } + + // Left Face + { + // Normal Pointing Left + rlNormal3f( - 1.0f, 0.0f, 0.0f); + + // Bottom Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x - width/2, y - height/2, z - length/2); + + // Bottom Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, (source.y + source.height) / texture_height); + rlVertex3f(x - width/2, y - height/2, z + length/2); + + // Top Right Of The Texture and Quad + rlTexCoord2f((source.x + source.width) / texture_width, source.y / texture_height); + rlVertex3f(x - width/2, y + height/2, z + length/2); + + // Top Left Of The Texture and Quad + rlTexCoord2f(source.x / texture_width, source.y / texture_height); + rlVertex3f(x - width/2, y + height/2, z - length/2); + } + rlEnd(); + + rlSetTexture(0); +} + // Draw sphere void DrawSphere(Vector3 centerPos, float radius, Color color) { @@ -2424,7 +2575,7 @@ Mesh GenMeshHeightmap(Image heightmap, Vector3 size) int vCounter = 0; // Used to count vertices float by float int tcCounter = 0; // Used to count texcoords float by float int nCounter = 0; // Used to count normals float by float - + int trisCounter = 0; Vector3 scaleFactor = { size.x/mapX, size.y/255.0f, size.z/mapZ }; @@ -3100,7 +3251,7 @@ void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector { // NOTE: Billboard locked on axis-Y Vector3 up = { 0.0f, 1.0f, 0.0f }; - + DrawBillboardPro(camera, texture, source, position, up, size, Vector2Zero(), 0.0f, tint); } @@ -5540,7 +5691,7 @@ static Model LoadVOX(const char *fileName) int meshescount = 0; unsigned int readed = 0; unsigned char* fileData; - + //Read vox file into buffer fileData = LoadFileData(fileName, &readed); if (fileData == 0) @@ -5604,7 +5755,7 @@ static Model LoadVOX(const char *fileName) pmesh->vertices = MemAlloc(size); memcpy(pmesh->vertices, pvertices, size); - // Copy indices + // Copy indices // TODO: compute globals indices array size = voxarray.indices.used * sizeof(unsigned short); pmesh->indices = MemAlloc(size); diff --git a/src/raylib.h b/src/raylib.h index 8193cc4b1..22b5cf50c 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1374,6 +1374,7 @@ RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) RLAPI void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured +RLAPI void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color); // Draw cube with a region of a texture RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires