-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WARNING: REMOVED:
DrawCubeTexture()
, DrawCubeTextureRec()
Those two functions have been moved to a new example: `models_draw_cube_texture`. The reasons for this decision: - Function inflexibility: Many users with the need to draw a textured cube could need to customize the texture applied to every face, that function did not allow that kind of functionality. - rlgl functionality exposure: The implementation exposed will teach users how to implement custom textured triangles drawing.
- Loading branch information
Showing
4 changed files
with
245 additions
and
147 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,245 @@ | ||
/******************************************************************************************* | ||
* | ||
* raylib [models] example - Draw textured cube | ||
* | ||
* Example originally created with raylib 4.5, last time updated with raylib 4.5 | ||
* | ||
* 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) 2022 Ramon Santamaria (@raysan5) | ||
* | ||
********************************************************************************************/ | ||
|
||
#include "raylib.h" | ||
|
||
#include "rlgl.h" // Required to define vertex data (immediate-mode style) | ||
|
||
//------------------------------------------------------------------------------------ | ||
// Custom Functions Declaration | ||
//------------------------------------------------------------------------------------ | ||
void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured | ||
void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color); // Draw cube with a region of a texture | ||
|
||
//------------------------------------------------------------------------------------ | ||
// Program main entry point | ||
//------------------------------------------------------------------------------------ | ||
int main(void) | ||
{ | ||
// Initialization | ||
//-------------------------------------------------------------------------------------- | ||
const int screenWidth = 800; | ||
const int screenHeight = 450; | ||
|
||
InitWindow(screenWidth, screenHeight, "raylib [models] example - draw cube texture"); | ||
|
||
// Define the camera to look into our 3d world | ||
Camera camera = { 0 }; | ||
camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; | ||
camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||
camera.fovy = 45.0f; | ||
camera.projection = CAMERA_PERSPECTIVE; | ||
|
||
// Load texture to be applied to the cubes sides | ||
Texture2D texture = LoadTexture("resources/cubicmap_atlas.png"); | ||
|
||
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 | ||
//---------------------------------------------------------------------------------- | ||
// TODO: Update your variables here | ||
//---------------------------------------------------------------------------------- | ||
|
||
// Draw | ||
//---------------------------------------------------------------------------------- | ||
BeginDrawing(); | ||
|
||
ClearBackground(RAYWHITE); | ||
|
||
BeginMode3D(camera); | ||
|
||
// Draw cube with an applied texture | ||
DrawCubeTexture(texture, (Vector3){ -2.0f, 2.0f, 0.0f }, 2.0f, 4.0f, 2.0f, WHITE); | ||
|
||
// Draw cube with an applied texture, but only a defined rectangle piece of the texture | ||
DrawCubeTextureRec(texture, (Rectangle){ 0, texture.height/2, texture.width/2, texture.height/2 }, | ||
(Vector3){ 2.0f, 1.0f, 0.0f }, 2.0f, 2.0f, 2.0f, WHITE); | ||
|
||
DrawGrid(10, 1.0f); // Draw a grid | ||
|
||
EndMode3D(); | ||
|
||
DrawFPS(10, 10); | ||
|
||
EndDrawing(); | ||
//---------------------------------------------------------------------------------- | ||
} | ||
|
||
// De-Initialization | ||
//-------------------------------------------------------------------------------------- | ||
UnloadTexture(texture); // Unload texture | ||
|
||
CloseWindow(); // Close window and OpenGL context | ||
//-------------------------------------------------------------------------------------- | ||
|
||
return 0; | ||
} | ||
|
||
//------------------------------------------------------------------------------------ | ||
// Custom Functions Definition | ||
//------------------------------------------------------------------------------------ | ||
// Draw cube textured | ||
// NOTE: Cube position is the center position | ||
void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color) | ||
{ | ||
float x = position.x; | ||
float y = position.y; | ||
float z = position.z; | ||
|
||
// Set desired texture to be enabled while drawing following vertex data | ||
rlSetTexture(texture.id); | ||
|
||
// Vertex data transformation can be defined with the commented lines, | ||
// but in this example we calculate the transformed vertex data directly when calling rlVertex3f() | ||
//rlPushMatrix(); | ||
// NOTE: Transformation is applied in inverse order (scale -> rotate -> translate) | ||
//rlTranslatef(2.0f, 0.0f, 0.0f); | ||
//rlRotatef(45, 0, 1, 0); | ||
//rlScalef(2.0f, 2.0f, 2.0f); | ||
|
||
rlBegin(RL_QUADS); | ||
rlColor4ub(color.r, color.g, color.b, color.a); | ||
// Front Face | ||
rlNormal3f(0.0f, 0.0f, 1.0f); // Normal Pointing Towards Viewer | ||
rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z + length/2); // Bottom Left Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z + length/2); // Bottom Right Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z + length/2); // Top Right Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z + length/2); // Top Left Of The Texture and Quad | ||
// Back Face | ||
rlNormal3f(0.0f, 0.0f, - 1.0f); // Normal Pointing Away From Viewer | ||
rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z - length/2); // Bottom Right Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z - length/2); // Top Right Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z - length/2); // Top Left Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z - length/2); // Bottom Left Of The Texture and Quad | ||
// Top Face | ||
rlNormal3f(0.0f, 1.0f, 0.0f); // Normal Pointing Up | ||
rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z - length/2); // Top Left Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x - width/2, y + height/2, z + length/2); // Bottom Left Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x + width/2, y + height/2, z + length/2); // Bottom Right Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z - length/2); // Top Right Of The Texture and Quad | ||
// Bottom Face | ||
rlNormal3f(0.0f, - 1.0f, 0.0f); // Normal Pointing Down | ||
rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x - width/2, y - height/2, z - length/2); // Top Right Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x + width/2, y - height/2, z - length/2); // Top Left Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z + length/2); // Bottom Left Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z + length/2); // Bottom Right Of The Texture and Quad | ||
// Right face | ||
rlNormal3f(1.0f, 0.0f, 0.0f); // Normal Pointing Right | ||
rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z - length/2); // Bottom Right Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z - length/2); // Top Right Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x + width/2, y + height/2, z + length/2); // Top Left Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x + width/2, y - height/2, z + length/2); // Bottom Left Of The Texture and Quad | ||
// Left Face | ||
rlNormal3f( - 1.0f, 0.0f, 0.0f); // Normal Pointing Left | ||
rlTexCoord2f(0.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z - length/2); // Bottom Left Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 0.0f); rlVertex3f(x - width/2, y - height/2, z + length/2); // Bottom Right Of The Texture and Quad | ||
rlTexCoord2f(1.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z + length/2); // Top Right Of The Texture and Quad | ||
rlTexCoord2f(0.0f, 1.0f); rlVertex3f(x - width/2, y + height/2, z - length/2); // Top Left Of The Texture and Quad | ||
rlEnd(); | ||
//rlPopMatrix(); | ||
|
||
rlSetTexture(0); | ||
} | ||
|
||
// Draw cube with texture piece applied to all faces | ||
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 texWidth = (float)texture.width; | ||
float texHeight = (float)texture.height; | ||
|
||
// Set desired texture to be enabled while drawing following vertex data | ||
rlSetTexture(texture.id); | ||
|
||
// We calculate the normalized texture coordinates for the desired texture-source-rectangle | ||
// It means converting from (tex.width, tex.height) coordinates to [0.0f, 1.0f] equivalent | ||
rlBegin(RL_QUADS); | ||
rlColor4ub(color.r, color.g, color.b, color.a); | ||
|
||
// Front face | ||
rlNormal3f(0.0f, 0.0f, 1.0f); | ||
rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x - width/2, y - height/2, z + length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x + width/2, y - height/2, z + length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||
rlVertex3f(x + width/2, y + height/2, z + length/2); | ||
rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||
rlVertex3f(x - width/2, y + height/2, z + length/2); | ||
|
||
// Back face | ||
rlNormal3f(0.0f, 0.0f, - 1.0f); | ||
rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x - width/2, y - height/2, z - length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||
rlVertex3f(x - width/2, y + height/2, z - length/2); | ||
rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||
rlVertex3f(x + width/2, y + height/2, z - length/2); | ||
rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x + width/2, y - height/2, z - length/2); | ||
|
||
// Top face | ||
rlNormal3f(0.0f, 1.0f, 0.0f); | ||
rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||
rlVertex3f(x - width/2, y + height/2, z - length/2); | ||
rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x - width/2, y + height/2, z + length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x + width/2, y + height/2, z + length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||
rlVertex3f(x + width/2, y + height/2, z - length/2); | ||
|
||
// Bottom face | ||
rlNormal3f(0.0f, - 1.0f, 0.0f); | ||
rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||
rlVertex3f(x - width/2, y - height/2, z - length/2); | ||
rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||
rlVertex3f(x + width/2, y - height/2, z - length/2); | ||
rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x + width/2, y - height/2, z + length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x - width/2, y - height/2, z + length/2); | ||
|
||
// Right face | ||
rlNormal3f(1.0f, 0.0f, 0.0f); | ||
rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x + width/2, y - height/2, z - length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||
rlVertex3f(x + width/2, y + height/2, z - length/2); | ||
rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||
rlVertex3f(x + width/2, y + height/2, z + length/2); | ||
rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x + width/2, y - height/2, z + length/2); | ||
|
||
// Left face | ||
rlNormal3f( - 1.0f, 0.0f, 0.0f); | ||
rlTexCoord2f(source.x/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x - width/2, y - height/2, z - length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, (source.y + source.height)/texHeight); | ||
rlVertex3f(x - width/2, y - height/2, z + length/2); | ||
rlTexCoord2f((source.x + source.width)/texWidth, source.y/texHeight); | ||
rlVertex3f(x - width/2, y + height/2, z + length/2); | ||
rlTexCoord2f(source.x/texWidth, source.y/texHeight); | ||
rlVertex3f(x - width/2, y + height/2, z - length/2); | ||
|
||
rlEnd(); | ||
|
||
rlSetTexture(0); | ||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.