|
|
@ -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); |
|
|
|
} |