mirror of
https://github.com/raysan5/raylib.git
synced 2026-03-29 03:42:04 +00:00
Remove trailing spaces
This commit is contained in:
@@ -110,16 +110,16 @@ int main(void)
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
|
||||
DrawText(TextFormat("sine frequency: %i", sineFrequency), screenWidth - 220, 10, 20, RED);
|
||||
DrawText(TextFormat("pan: %.2f", pan), screenWidth - 220, 30, 20, RED);
|
||||
DrawText("Up/down to change frequency", 10, 10, 20, DARKGRAY);
|
||||
DrawText("Left/right to pan", 10, 30, 20, DARKGRAY);
|
||||
|
||||
|
||||
int windowStart = (GetTime() - sineStartTime)*SAMPLE_RATE;
|
||||
int windowSize = 0.1f*SAMPLE_RATE;
|
||||
int wavelength = SAMPLE_RATE/sineFrequency;
|
||||
|
||||
|
||||
// Draw a sine wave with the same frequency as the one being sent to the audio stream
|
||||
for (int i = 0; i < screenWidth; i++)
|
||||
{
|
||||
|
||||
@@ -73,7 +73,7 @@ int main(void)
|
||||
}
|
||||
|
||||
// Draw UI info
|
||||
DrawText(TextFormat("CURRENT MONITOR: %i/%i (%ix%i)", currentMonitor + 1, GetMonitorCount(),
|
||||
DrawText(TextFormat("CURRENT MONITOR: %i/%i (%ix%i)", currentMonitor + 1, GetMonitorCount(),
|
||||
GetMonitorWidth(currentMonitor), GetMonitorHeight(currentMonitor)), 50, 50, 20, DARKGRAY);
|
||||
DrawText(TextFormat("WINDOW POSITION: %ix%i", (int)windowPos.x, (int)windowPos.y), 50, 90, 20, DARKGRAY);
|
||||
DrawText(TextFormat("SCREEN SIZE: %ix%i", GetScreenWidth(), GetScreenHeight()), 50, 130, 20, DARKGRAY);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Example complexity rating: [★★☆☆] 2/4
|
||||
*
|
||||
* NOTE: raylib defined keys refer to ENG-US Keyboard layout,
|
||||
* NOTE: raylib defined keys refer to ENG-US Keyboard layout,
|
||||
* mapping to other layouts is up to the user
|
||||
*
|
||||
* Example originally created with raylib 5.6, last time updated with raylib 5.6
|
||||
@@ -43,20 +43,20 @@ int main(void)
|
||||
int line01KeyWidths[15] = { 0 };
|
||||
for (int i = 0; i < 15; i++) line01KeyWidths[i] = 45;
|
||||
line01KeyWidths[13] = 62; // PRINTSCREEN
|
||||
int line01Keys[15] = {
|
||||
KEY_ESCAPE, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5,
|
||||
KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11,
|
||||
KEY_F12, KEY_PRINT_SCREEN, KEY_PAUSE
|
||||
int line01Keys[15] = {
|
||||
KEY_ESCAPE, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5,
|
||||
KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11,
|
||||
KEY_F12, KEY_PRINT_SCREEN, KEY_PAUSE
|
||||
};
|
||||
|
||||
|
||||
// Keyboard line 02
|
||||
int line02KeyWidths[15] = { 0 };
|
||||
for (int i = 0; i < 15; i++) line02KeyWidths[i] = 45;
|
||||
line02KeyWidths[0] = 25; // GRAVE
|
||||
line02KeyWidths[13] = 82; // BACKSPACE
|
||||
int line02Keys[15] = {
|
||||
KEY_GRAVE, KEY_ONE, KEY_TWO, KEY_THREE, KEY_FOUR,
|
||||
KEY_FIVE, KEY_SIX, KEY_SEVEN, KEY_EIGHT, KEY_NINE,
|
||||
int line02Keys[15] = {
|
||||
KEY_GRAVE, KEY_ONE, KEY_TWO, KEY_THREE, KEY_FOUR,
|
||||
KEY_FIVE, KEY_SIX, KEY_SEVEN, KEY_EIGHT, KEY_NINE,
|
||||
KEY_ZERO, KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_DELETE };
|
||||
|
||||
// Keyboard line 03
|
||||
@@ -103,7 +103,7 @@ int main(void)
|
||||
KEY_SPACE, KEY_RIGHT_ALT, 162, KEY_NULL,
|
||||
KEY_RIGHT_CONTROL, KEY_LEFT, KEY_DOWN, KEY_RIGHT
|
||||
};
|
||||
|
||||
|
||||
Vector2 keyboardOffset = { 26, 80 };
|
||||
|
||||
SetTargetFPS(60);
|
||||
@@ -128,23 +128,23 @@ int main(void)
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
DrawText("KEYBOARD LAYOUT: ENG-US", 26, 38, 20, LIGHTGRAY);
|
||||
|
||||
|
||||
// Keyboard line 01 - 15 keys
|
||||
// ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, IMP, CLOSE
|
||||
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
||||
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
||||
{
|
||||
GuiKeyboardKey((Rectangle){ keyboardOffset.x + recOffsetX, keyboardOffset.y, (float)line01KeyWidths[i], 30.0f }, line01Keys[i]);
|
||||
recOffsetX += line01KeyWidths[i] + KEY_REC_SPACING;
|
||||
}
|
||||
|
||||
|
||||
// Keyboard line 02 - 15 keys
|
||||
// `, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, BACKSPACE, DEL
|
||||
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
||||
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
||||
{
|
||||
GuiKeyboardKey((Rectangle){ keyboardOffset.x + recOffsetX, keyboardOffset.y + 30 + KEY_REC_SPACING, (float)line02KeyWidths[i], 38.0f }, line02Keys[i]);
|
||||
recOffsetX += line02KeyWidths[i] + KEY_REC_SPACING;
|
||||
}
|
||||
|
||||
|
||||
// Keyboard line 03 - 15 keys
|
||||
// TAB, Q, W, E, R, T, Y, U, I, O, P, [, ], \, INS
|
||||
for (int i = 0, recOffsetX = 0; i < 15; i++)
|
||||
@@ -324,8 +324,8 @@ static void GuiKeyboardKey(Rectangle bounds, int key)
|
||||
DrawText(GetKeyText(key), (int)(bounds.x + 4), (int)(bounds.y + 4), 10, DARKGRAY);
|
||||
}
|
||||
}
|
||||
|
||||
if (CheckCollisionPointRec(GetMousePosition(), bounds))
|
||||
|
||||
if (CheckCollisionPointRec(GetMousePosition(), bounds))
|
||||
{
|
||||
DrawRectangleRec(bounds, Fade(RED, 0.2f));
|
||||
DrawRectangleLinesEx(bounds, 3.0f, RED);
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
// Module Functions Declaration
|
||||
//------------------------------------------------------------------------------------
|
||||
static bool IsUpperBodyBone(const char *boneName);
|
||||
static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim1, int frame1,
|
||||
static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim1, int frame1,
|
||||
ModelAnimation *anim2, int frame2, float blend, bool upperBodyBlend);
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
@@ -86,7 +86,7 @@ int main(void)
|
||||
int animIndex1 = 3; // Attack animation (index 3)
|
||||
int animCurrentFrame0 = 0;
|
||||
int animCurrentFrame1 = 0;
|
||||
|
||||
|
||||
// Validate indices
|
||||
if (animIndex0 >= animCount) animIndex0 = 0;
|
||||
if (animIndex1 >= animCount) animIndex1 = (animCount > 1) ? 1 : 0;
|
||||
@@ -109,7 +109,7 @@ int main(void)
|
||||
// Update animation frames
|
||||
ModelAnimation anim0 = anims[animIndex0];
|
||||
ModelAnimation anim1 = anims[animIndex1];
|
||||
|
||||
|
||||
animCurrentFrame0 = (animCurrentFrame0 + 1)%anim0.keyframeCount;
|
||||
animCurrentFrame1 = (animCurrentFrame1 + 1)%anim1.keyframeCount;
|
||||
|
||||
@@ -117,11 +117,11 @@ int main(void)
|
||||
// When upperBodyBlend is ON: upper body = attack (1.0), lower body = walk (0.0)
|
||||
// When upperBodyBlend is OFF: uniform blend at 0.5 (50% walk, 50% attack)
|
||||
float blendFactor = (upperBodyBlend? 1.0f : 0.5f);
|
||||
UpdateModelAnimationBones(&model, &anim0, animCurrentFrame0,
|
||||
UpdateModelAnimationBones(&model, &anim0, animCurrentFrame0,
|
||||
&anim1, animCurrentFrame1, blendFactor, upperBodyBlend);
|
||||
|
||||
// raylib provided animation blending function
|
||||
//UpdateModelAnimationEx(model, anim0, (float)animCurrentFrame0,
|
||||
//UpdateModelAnimationEx(model, anim0, (float)animCurrentFrame0,
|
||||
// anim1, (float)animCurrentFrame1, blendFactor);
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
@@ -142,8 +142,8 @@ int main(void)
|
||||
// Draw UI
|
||||
DrawText(TextFormat("ANIM 0: %s", anim0.name), 10, 10, 20, GRAY);
|
||||
DrawText(TextFormat("ANIM 1: %s", anim1.name), 10, 40, 20, GRAY);
|
||||
DrawText(TextFormat("[SPACE] Toggle blending mode: %s",
|
||||
upperBodyBlend? "Upper/Lower Body Blending" : "Uniform Blending"),
|
||||
DrawText(TextFormat("[SPACE] Toggle blending mode: %s",
|
||||
upperBodyBlend? "Upper/Lower Body Blending" : "Uniform Blending"),
|
||||
10, GetScreenHeight() - 30, 20, DARKGRAY);
|
||||
|
||||
EndDrawing();
|
||||
@@ -180,7 +180,7 @@ static bool IsUpperBodyBone(const char *boneName)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Check if bone name contains upper body keywords
|
||||
if (strstr(boneName, "spine") != NULL || strstr(boneName, "chest") != NULL ||
|
||||
strstr(boneName, "neck") != NULL || strstr(boneName, "head") != NULL ||
|
||||
@@ -189,12 +189,12 @@ static bool IsUpperBodyBone(const char *boneName)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Blend two animations per-bone with selective upper/lower body blending
|
||||
static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim0, int frame0,
|
||||
static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim0, int frame0,
|
||||
ModelAnimation *anim1, int frame1, float blend, bool upperBodyBlend)
|
||||
{
|
||||
// Validate inputs
|
||||
@@ -204,59 +204,59 @@ static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim0, int f
|
||||
{
|
||||
// Clamp blend factor to [0, 1]
|
||||
blend = fminf(1.0f, fmaxf(0.0f, blend));
|
||||
|
||||
|
||||
// Ensure frame indices are valid
|
||||
if (frame0 >= anim0->keyframeCount) frame0 = anim0->keyframeCount - 1;
|
||||
if (frame1 >= anim1->keyframeCount) frame1 = anim1->keyframeCount - 1;
|
||||
if (frame0 < 0) frame0 = 0;
|
||||
if (frame1 < 0) frame1 = 0;
|
||||
|
||||
|
||||
// Get bone count (use minimum of all to be safe)
|
||||
int boneCount = model->skeleton.boneCount;
|
||||
if (anim0->boneCount < boneCount) boneCount = anim0->boneCount;
|
||||
if (anim1->boneCount < boneCount) boneCount = anim1->boneCount;
|
||||
|
||||
|
||||
// Blend each bone
|
||||
for (int boneIndex = 0; boneIndex < boneCount; boneIndex++)
|
||||
{
|
||||
// Determine blend factor for this bone
|
||||
float boneBlendFactor = blend;
|
||||
|
||||
|
||||
// If upper body blending is enabled, use different blend factors for upper vs lower body
|
||||
if (upperBodyBlend)
|
||||
{
|
||||
const char *boneName = model->skeleton.bones[boneIndex].name;
|
||||
bool isUpperBody = IsUpperBodyBone(boneName);
|
||||
|
||||
|
||||
// Upper body: use anim1 (attack), Lower body: use anim0 (walk)
|
||||
// blend = 0.0 means full anim0 (walk), 1.0 means full anim1 (attack)
|
||||
if (isUpperBody) boneBlendFactor = blend; // Upper body: blend towards anim1 (attack)
|
||||
else boneBlendFactor = 1.0f - blend; // Lower body: blend towards anim0 (walk) - invert the blend
|
||||
}
|
||||
|
||||
|
||||
// Get transforms from both animations
|
||||
Transform *bindTransform = &model->skeleton.bindPose[boneIndex];
|
||||
Transform *animTransform0 = &anim0->keyframePoses[frame0][boneIndex];
|
||||
Transform *animTransform1 = &anim1->keyframePoses[frame1][boneIndex];
|
||||
|
||||
|
||||
// Blend the transforms
|
||||
Transform blended = { 0 };
|
||||
blended.translation = Vector3Lerp(animTransform0->translation, animTransform1->translation, boneBlendFactor);
|
||||
blended.rotation = QuaternionSlerp(animTransform0->rotation, animTransform1->rotation, boneBlendFactor);
|
||||
blended.scale = Vector3Lerp(animTransform0->scale, animTransform1->scale, boneBlendFactor);
|
||||
|
||||
|
||||
// Convert bind pose to matrix
|
||||
Matrix bindMatrix = MatrixMultiply(MatrixMultiply(
|
||||
MatrixScale(bindTransform->scale.x, bindTransform->scale.y, bindTransform->scale.z),
|
||||
QuaternionToMatrix(bindTransform->rotation)),
|
||||
MatrixTranslate(bindTransform->translation.x, bindTransform->translation.y, bindTransform->translation.z));
|
||||
|
||||
|
||||
// Convert blended transform to matrix
|
||||
Matrix blendedMatrix = MatrixMultiply(MatrixMultiply(
|
||||
MatrixScale(blended.scale.x, blended.scale.y, blended.scale.z),
|
||||
QuaternionToMatrix(blended.rotation)),
|
||||
MatrixTranslate(blended.translation.x, blended.translation.y, blended.translation.z));
|
||||
|
||||
|
||||
// Calculate final bone matrix (similar to UpdateModelAnimationBones)
|
||||
model->boneMatrices[boneIndex] = MatrixMultiply(MatrixInvert(bindMatrix), blendedMatrix);
|
||||
}
|
||||
@@ -276,7 +276,7 @@ static void UpdateModelAnimationBones(Model *model, ModelAnimation *anim0, int f
|
||||
bool bufferUpdateRequired = false; // Flag to check when anim vertex information is updated
|
||||
|
||||
// Skip if missing bone data or missing anim buffers initialization
|
||||
if ((mesh.boneWeights == NULL) || (mesh.boneIndices == NULL) ||
|
||||
if ((mesh.boneWeights == NULL) || (mesh.boneIndices == NULL) ||
|
||||
(mesh.animVertices == NULL) || (mesh.animNormals == NULL)) continue;
|
||||
|
||||
for (int vCounter = 0; vCounter < vertexValuesCount; vCounter += 3)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* raylib [models] example - animation blending
|
||||
*
|
||||
* Example complexity rating: [★★★★] 4/4
|
||||
*
|
||||
*
|
||||
* Example originally created with raylib 5.5, last time updated with raylib 6.0
|
||||
*
|
||||
* Example contributed by Kirandeep (@Kirandeep-Singh-Khehra) and reviewed by Ramon Santamaria (@raysan5)
|
||||
@@ -57,7 +57,7 @@ int main(void)
|
||||
// WARNING: It requires SUPPORT_GPU_SKINNING enabled on raylib (disabled by default)
|
||||
Shader skinningShader = LoadShader(TextFormat("resources/shaders/glsl%i/skinning.vs", GLSL_VERSION),
|
||||
TextFormat("resources/shaders/glsl%i/skinning.fs", GLSL_VERSION));
|
||||
|
||||
|
||||
// Assign skinning shader to all materials shaders
|
||||
//for (int i = 0; i < model.materialCount; i++) model.materials[i].shader = skinningShader;
|
||||
|
||||
@@ -105,7 +105,7 @@ int main(void)
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
UpdateCamera(&camera, CAMERA_ORBITAL);
|
||||
|
||||
|
||||
if (IsKeyPressed(KEY_P)) animPause = !animPause;
|
||||
|
||||
if (!animPause)
|
||||
@@ -127,7 +127,7 @@ int main(void)
|
||||
}
|
||||
|
||||
// Set animation transition
|
||||
animTransition = true;
|
||||
animTransition = true;
|
||||
animBlendTimeCounter = 0.0f;
|
||||
animBlendFactor = 0.0f;
|
||||
}
|
||||
@@ -182,7 +182,7 @@ int main(void)
|
||||
animCurrentFrame0 += animFrameSpeed0;
|
||||
if (animCurrentFrame0 >= anims[animIndex0].keyframeCount) animCurrentFrame0 = 0.0f;
|
||||
UpdateModelAnimation(model, anims[animIndex0], animCurrentFrame0);
|
||||
//UpdateModelAnimationEx(model, anims[animIndex0], animCurrentFrame0,
|
||||
//UpdateModelAnimationEx(model, anims[animIndex0], animCurrentFrame0,
|
||||
// anims[animIndex1], animCurrentFrame1, 0.0f); // Same as above, first animation frame blend
|
||||
}
|
||||
else if (currentAnimPlaying == 1)
|
||||
@@ -191,7 +191,7 @@ int main(void)
|
||||
animCurrentFrame1 += animFrameSpeed1;
|
||||
if (animCurrentFrame1 >= anims[animIndex1].keyframeCount) animCurrentFrame1 = 0.0f;
|
||||
UpdateModelAnimation(model, anims[animIndex1], animCurrentFrame1);
|
||||
//UpdateModelAnimationEx(model, anims[animIndex0], animCurrentFrame0,
|
||||
//UpdateModelAnimationEx(model, anims[animIndex0], animCurrentFrame0,
|
||||
// anims[animIndex1], animCurrentFrame1, 1.0f); // Same as above, second animation frame blend
|
||||
}
|
||||
}
|
||||
@@ -213,7 +213,7 @@ int main(void)
|
||||
DrawModel(model, position, 1.0f, WHITE); // Draw animated model
|
||||
|
||||
DrawGrid(10, 1.0f);
|
||||
|
||||
|
||||
EndMode3D();
|
||||
|
||||
if (animTransition) DrawText("ANIM TRANSITION BLENDING!", 170, 50, 30, BLUE);
|
||||
@@ -221,18 +221,18 @@ int main(void)
|
||||
// Draw UI elements
|
||||
//---------------------------------------------------------------------------------------------
|
||||
if (dropdownEditMode0) GuiDisable();
|
||||
GuiSlider((Rectangle){ 10, 38, 160, 12 },
|
||||
GuiSlider((Rectangle){ 10, 38, 160, 12 },
|
||||
NULL, TextFormat("x%.1f", animFrameSpeed0), &animFrameSpeed0, 0.1f, 2.0f);
|
||||
GuiEnable();
|
||||
if (dropdownEditMode1) GuiDisable();
|
||||
GuiSlider((Rectangle){ GetScreenWidth() - 170.0f, 38, 160, 12 },
|
||||
GuiSlider((Rectangle){ GetScreenWidth() - 170.0f, 38, 160, 12 },
|
||||
TextFormat("%.1fx", animFrameSpeed1), NULL, &animFrameSpeed1, 0.1f, 2.0f);
|
||||
GuiEnable();
|
||||
|
||||
// Draw animation selectors for blending transition
|
||||
// NOTE: Transition does not start until requested
|
||||
// NOTE: Transition does not start until requested
|
||||
GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 1);
|
||||
if (GuiDropdownBox((Rectangle){ 10, 10, 160, 24 }, TextJoin(animNames, animCount, ";"),
|
||||
if (GuiDropdownBox((Rectangle){ 10, 10, 160, 24 }, TextJoin(animNames, animCount, ";"),
|
||||
&animIndex0, dropdownEditMode0)) dropdownEditMode0 = !dropdownEditMode0;
|
||||
|
||||
// Blending process progress bar
|
||||
@@ -249,7 +249,7 @@ int main(void)
|
||||
TextFormat("FRAME: %.2f / %i", animFrameProgress0, anims[animIndex0].keyframeCount),
|
||||
&animFrameProgress0, 0.0f, (float)anims[animIndex0].keyframeCount);
|
||||
for (int i = 0; i < anims[animIndex0].keyframeCount; i++)
|
||||
DrawRectangle(60 + (int)(((float)(GetScreenWidth() - 180)/(float)anims[animIndex0].keyframeCount)*(float)i),
|
||||
DrawRectangle(60 + (int)(((float)(GetScreenWidth() - 180)/(float)anims[animIndex0].keyframeCount)*(float)i),
|
||||
GetScreenHeight() - 60, 1, 20, BLUE);
|
||||
|
||||
// Draw playing timeline with keyframes for anim1[]
|
||||
@@ -257,7 +257,7 @@ int main(void)
|
||||
TextFormat("FRAME: %.2f / %i", animFrameProgress1, anims[animIndex1].keyframeCount),
|
||||
&animFrameProgress1, 0.0f, (float)anims[animIndex1].keyframeCount);
|
||||
for (int i = 0; i < anims[animIndex1].keyframeCount; i++)
|
||||
DrawRectangle(60 + (int)(((float)(GetScreenWidth() - 180)/(float)anims[animIndex1].keyframeCount)*(float)i),
|
||||
DrawRectangle(60 + (int)(((float)(GetScreenWidth() - 180)/(float)anims[animIndex1].keyframeCount)*(float)i),
|
||||
GetScreenHeight() - 30, 1, 20, BLUE);
|
||||
//---------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -270,7 +270,7 @@ int main(void)
|
||||
UnloadModelAnimations(anims, animCount); // Unload model animation
|
||||
UnloadModel(model); // Unload model and meshes/material
|
||||
UnloadShader(skinningShader); // Unload GPU skinning shader
|
||||
|
||||
|
||||
CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -94,26 +94,26 @@ int main(void)
|
||||
BeginMode3D(camera);
|
||||
|
||||
DrawModel(model, position, 1.0f, WHITE);
|
||||
|
||||
|
||||
DrawGrid(10, 1.0f);
|
||||
|
||||
|
||||
EndMode3D();
|
||||
|
||||
// Draw UI, select anim and playing speed
|
||||
GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 1);
|
||||
if (GuiDropdownBox((Rectangle){ 10, 10, 140, 24 }, TextJoin(animNames, animCount, ";"),
|
||||
if (GuiDropdownBox((Rectangle){ 10, 10, 140, 24 }, TextJoin(animNames, animCount, ";"),
|
||||
&animIndex, dropdownEditMode)) dropdownEditMode = !dropdownEditMode;
|
||||
|
||||
GuiSlider((Rectangle){ 260, 10, 500, 24 }, "FRAME SPEED: ", TextFormat("x%.1f", animFrameSpeed),
|
||||
&animFrameSpeed, 0.1f, 2.0f);
|
||||
|
||||
// Draw playing timeline with keyframes
|
||||
GuiLabel((Rectangle){ 10, GetScreenHeight() - 64.0f, GetScreenWidth() - 20.0f, 24 },
|
||||
GuiLabel((Rectangle){ 10, GetScreenHeight() - 64.0f, GetScreenWidth() - 20.0f, 24 },
|
||||
TextFormat("CURRENT FRAME: %.2f / %i", animFrameProgress, anims[animIndex].keyframeCount));
|
||||
GuiProgressBar((Rectangle){ 10, GetScreenHeight() - 40.0f, GetScreenWidth() - 20.0f, 24 }, NULL, NULL,
|
||||
&animFrameProgress, 0.0f, (float)anims[animIndex].keyframeCount);
|
||||
for (int i = 0; i < anims[animIndex].keyframeCount; i++)
|
||||
DrawRectangle(10 + (int)(((float)(GetScreenWidth() - 20)/(float)anims[animIndex].keyframeCount)*(float)i),
|
||||
DrawRectangle(10 + (int)(((float)(GetScreenWidth() - 20)/(float)anims[animIndex].keyframeCount)*(float)i),
|
||||
GetScreenHeight() - 40, 1, 24, BLUE);
|
||||
|
||||
EndDrawing();
|
||||
|
||||
@@ -60,7 +60,7 @@ int main(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SetTargetFPS(60);
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
@@ -109,7 +109,7 @@ int main(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Remove the closest voxel if one was hit
|
||||
if (voxelFound)
|
||||
{
|
||||
@@ -145,9 +145,9 @@ int main(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EndMode3D();
|
||||
|
||||
|
||||
// Draw reference point for raycasting to delete blocks
|
||||
DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, 4, RED);
|
||||
|
||||
@@ -161,7 +161,7 @@ int main(void)
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
UnloadModel(cubeModel);
|
||||
|
||||
|
||||
CloseWindow();
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ int main(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: WARNING: On PLATFORM_WEB it requires a big amount of memory to process input image
|
||||
// TODO: WARNING: On PLATFORM_WEB it requires a big amount of memory to process input image
|
||||
// and generate the required cubemap image to be passed to rlLoadTextureCubemap()
|
||||
Image image = LoadImage("resources/skybox.png");
|
||||
skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = LoadTextureCubemap(image, CUBEMAP_LAYOUT_AUTO_DETECT);
|
||||
|
||||
@@ -41,7 +41,7 @@ int main(void)
|
||||
|
||||
Model model = LoadModel("resources/models/obj/plane.obj"); // Load model
|
||||
Texture2D texture = LoadTexture("resources/models/obj/plane_diffuse.png"); // Load model texture
|
||||
|
||||
|
||||
SetTextureWrap(texture, TEXTURE_WRAP_REPEAT); // Force Repeat to avoid issue on Web version
|
||||
|
||||
model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; // Set map diffuse texture
|
||||
|
||||
@@ -52,7 +52,7 @@ int main(void)
|
||||
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
|
||||
camera.fovy = 45.0f;
|
||||
camera.projection = CAMERA_PERSPECTIVE;
|
||||
|
||||
|
||||
// Load model
|
||||
Model model = LoadModel("resources/models/old_car_new.glb");
|
||||
|
||||
@@ -61,7 +61,7 @@ int main(void)
|
||||
TextFormat("resources/shaders/glsl%i/cel.vs", GLSL_VERSION),
|
||||
TextFormat("resources/shaders/glsl%i/cel.fs", GLSL_VERSION));
|
||||
celShader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(celShader, "viewPos");
|
||||
|
||||
|
||||
// Apply cel shader to model, keep copy of default shader
|
||||
Shader defaultShader = model.materials[0].shader;
|
||||
model.materials[0].shader = celShader;
|
||||
@@ -134,16 +134,16 @@ int main(void)
|
||||
// Outline pass: cull front faces, draw extruded back faces as silhouette
|
||||
float thickness = 0.005f;
|
||||
SetShaderValue(outlineShader, outlineThicknessLoc, &thickness, SHADER_UNIFORM_FLOAT);
|
||||
|
||||
|
||||
rlSetCullFace(RL_CULL_FACE_FRONT);
|
||||
|
||||
|
||||
model.materials[0].shader = outlineShader;
|
||||
|
||||
|
||||
DrawModel(model, Vector3Zero(), 0.75f, WHITE);
|
||||
|
||||
|
||||
if (celEnabled) model.materials[0].shader = celShader; // Apply cel shader to model
|
||||
else model.materials[0].shader = defaultShader; // Apply default shader to model
|
||||
|
||||
|
||||
rlSetCullFace(RL_CULL_FACE_BACK);
|
||||
}
|
||||
|
||||
@@ -167,7 +167,7 @@ int main(void)
|
||||
UnloadModel(model);
|
||||
UnloadShader(celShader);
|
||||
UnloadShader(outlineShader);
|
||||
|
||||
|
||||
CloseWindow();
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ int main(void)
|
||||
rlClearColor(0, 0, 0, 0);
|
||||
rlClearScreenBuffers(); // Clear color and depth buffer
|
||||
rlDisableColorBlend();
|
||||
|
||||
|
||||
BeginMode3D(camera);
|
||||
// NOTE: We have to use rlEnableShader here. `BeginShaderMode` or thus `rlSetShader`
|
||||
// will not work, as they won't immediately load the shader program
|
||||
@@ -226,7 +226,7 @@ int main(void)
|
||||
}
|
||||
rlDisableShader();
|
||||
EndMode3D();
|
||||
|
||||
|
||||
rlEnableColorBlend();
|
||||
|
||||
// Go back to the default framebufferId (0) and draw our deferred shading
|
||||
|
||||
@@ -59,7 +59,7 @@ int main(void)
|
||||
//--------------------------------------------------------------------------------------
|
||||
const int screenWidth = 800;
|
||||
const int screenHeight = 450;
|
||||
|
||||
|
||||
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - game of life");
|
||||
|
||||
const int menuWidth = 100;
|
||||
@@ -81,7 +81,7 @@ int main(void)
|
||||
{ "Puffer train", { 0.1f, 0.5f } }, { "Glider Gun", { 0.2f, 0.2f } }, { "Breeder", { 0.1f, 0.5f } },
|
||||
{ "Random", { 0.5f, 0.5f } }
|
||||
};
|
||||
|
||||
|
||||
const int numberOfPresets = sizeof(presetPatterns)/sizeof(presetPatterns[0]);
|
||||
|
||||
int zoom = 1;
|
||||
@@ -90,7 +90,7 @@ int main(void)
|
||||
int framesPerStep = 1;
|
||||
int frame = 0;
|
||||
|
||||
int preset = -1; // No button pressed for preset
|
||||
int preset = -1; // No button pressed for preset
|
||||
int mode = MODE_RUN; // Starting mode: running
|
||||
bool buttonZoomIn = false; // Button states: false not pressed
|
||||
bool buttonZomOut = false;
|
||||
@@ -185,7 +185,7 @@ int main(void)
|
||||
EndTextureMode();
|
||||
imageToDraw = (Image*)RL_MALLOC(sizeof(Image));
|
||||
*imageToDraw = LoadImageFromTexture(worldOnScreen.texture);
|
||||
|
||||
|
||||
UnloadRenderTexture(worldOnScreen);
|
||||
}
|
||||
|
||||
@@ -199,9 +199,9 @@ int main(void)
|
||||
if (mouseY >= sizeInWorldY) mouseY = sizeInWorldY - 1;
|
||||
if (firstColor == -1) firstColor = (GetImageColor(*imageToDraw, mouseX, mouseY).r < 5)? 0 : 1;
|
||||
const int prevColor = (GetImageColor(*imageToDraw, mouseX, mouseY).r < 5)? 0 : 1;
|
||||
|
||||
|
||||
ImageDrawPixel(imageToDraw, mouseX, mouseY, (firstColor) ? BLACK : RAYWHITE);
|
||||
|
||||
|
||||
if (prevColor != firstColor) UpdateTextureRec(currentWorld->texture, (Rectangle){ floorf(offsetX), floorf(offsetY), (float)(sizeInWorldX), (float)(sizeInWorldY) }, imageToDraw->data);
|
||||
}
|
||||
else firstColor = -1;
|
||||
@@ -228,7 +228,7 @@ int main(void)
|
||||
BeginTextureMode(*currentWorld);
|
||||
ClearBackground(RAYWHITE);
|
||||
EndTextureMode();
|
||||
|
||||
|
||||
UpdateTextureRec(currentWorld->texture, (Rectangle){ worldWidth*presetPatterns[preset].position.x - pattern.width/2.0f,
|
||||
worldHeight*presetPatterns[preset].position.y - pattern.height/2.0f,
|
||||
(float)(pattern.width), (float)(pattern.height) }, pattern.data);
|
||||
@@ -256,7 +256,7 @@ int main(void)
|
||||
}
|
||||
|
||||
UnloadImage(pattern);
|
||||
|
||||
|
||||
mode = MODE_PAUSE;
|
||||
offsetX = worldWidth*presetPatterns[preset].position.x - (float)windowWidth/zoom/2.0f;
|
||||
offsetY = worldHeight*presetPatterns[preset].position.y - (float)windowHeight/zoom/2.0f;
|
||||
@@ -293,7 +293,7 @@ int main(void)
|
||||
// Draw to screen
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
|
||||
DrawTexturePro(currentWorld->texture, textureSourceToScreen, textureOnScreen, (Vector2){ 0, 0 }, 0.0f, WHITE);
|
||||
|
||||
DrawLine(windowWidth, 0, windowWidth, screenHeight, (Color){ 218, 218, 218, 255 });
|
||||
|
||||
@@ -31,7 +31,7 @@ typedef struct Ball {
|
||||
Vector2 speed;
|
||||
Vector2 prevPosition;
|
||||
float radius;
|
||||
float friction;
|
||||
float friction;
|
||||
float elasticity;
|
||||
Color color;
|
||||
bool grabbed;
|
||||
@@ -62,7 +62,7 @@ int main(void)
|
||||
.color = BLUE,
|
||||
.grabbed = false
|
||||
};
|
||||
|
||||
|
||||
int ballCount = 1;
|
||||
Ball *grabbedBall = NULL; // A pointer to the current ball that is grabbed
|
||||
Vector2 pressOffset = { 0 }; // Mouse press offset relative to the ball that grabbedd
|
||||
@@ -157,10 +157,10 @@ int main(void)
|
||||
{
|
||||
ball->position.x = screenWidth - ball->radius; // Ball repositioning
|
||||
ball->speed.x = -ball->speed.x*ball->elasticity; // Elasticity makes the ball lose 10% of its velocity on hit
|
||||
}
|
||||
}
|
||||
// Does the ball hit the screen left boundary?
|
||||
else if ((ball->position.x - ball->radius) <= 0)
|
||||
{
|
||||
{
|
||||
ball->position.x = ball->radius;
|
||||
ball->speed.x = -ball->speed.x*ball->elasticity;
|
||||
}
|
||||
@@ -170,9 +170,9 @@ int main(void)
|
||||
{
|
||||
ball->position.y = screenHeight - ball->radius;
|
||||
ball->speed.y = -ball->speed.y*ball->elasticity;
|
||||
}
|
||||
}
|
||||
else if ((ball->position.y - ball->radius) <= 0)
|
||||
{
|
||||
{
|
||||
ball->position.y = ball->radius;
|
||||
ball->speed.y = -ball->speed.y*ball->elasticity;
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ typedef struct EasingFuncs {
|
||||
// Module Functions Declaration
|
||||
//------------------------------------------------------------------------------------
|
||||
// Function used when "no easing" is selected for any axis
|
||||
static float NoEase(float t, float b, float c, float d);
|
||||
static float NoEase(float t, float b, float c, float d);
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// Global Variables Definition
|
||||
|
||||
@@ -46,13 +46,13 @@ int main(void)
|
||||
float size = (float)GetScreenHeight();
|
||||
int strokeCount = 0;
|
||||
Vector2 *hilbertPath = LoadHilbertPath(order, size, &strokeCount);
|
||||
|
||||
|
||||
int prevOrder = order;
|
||||
int prevSize = (int)size; // NOTE: Size from slider is float but for comparison we use int
|
||||
int counter = 0;
|
||||
float thick = 2.0f;
|
||||
bool animate = true;
|
||||
|
||||
|
||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
@@ -68,19 +68,19 @@ int main(void)
|
||||
{
|
||||
UnloadHilbertPath(hilbertPath);
|
||||
hilbertPath = LoadHilbertPath(order, size, &strokeCount);
|
||||
|
||||
|
||||
if (animate) counter = 0;
|
||||
else counter = strokeCount;
|
||||
|
||||
|
||||
prevOrder = order;
|
||||
prevSize = (int)size;
|
||||
}
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Draw
|
||||
//--------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
if (counter < strokeCount)
|
||||
@@ -90,7 +90,7 @@ int main(void)
|
||||
{
|
||||
DrawLineEx(hilbertPath[i], hilbertPath[i - 1], thick, ColorFromHSV(((float)i/strokeCount)*360.0f, 1.0f, 1.0f));
|
||||
}
|
||||
|
||||
|
||||
counter += 1;
|
||||
}
|
||||
else
|
||||
@@ -101,13 +101,13 @@ int main(void)
|
||||
DrawLineEx(hilbertPath[i], hilbertPath[i - 1], thick, ColorFromHSV(((float)i/strokeCount)*360.0f, 1.0f, 1.0f));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Draw UI using raygui
|
||||
GuiCheckBox((Rectangle){ 450, 50, 20, 20 }, "ANIMATE GENERATION ON CHANGE", &animate);
|
||||
GuiSpinner((Rectangle){ 585, 100, 180, 30 }, "HILBERT CURVE ORDER: ", &order, 2, 8, false);
|
||||
GuiSlider((Rectangle){ 524, 150, 240, 24 }, "THICKNESS: ", NULL, &thick, 1.0f, 10.0f);
|
||||
GuiSlider((Rectangle){ 524, 190, 240, 24 }, "TOTAL SIZE: ", NULL, &size, 10.0f, GetScreenHeight()*1.5f);
|
||||
|
||||
|
||||
EndDrawing();
|
||||
//--------------------------------------------------------------------------
|
||||
}
|
||||
@@ -116,7 +116,7 @@ int main(void)
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
UnloadHilbertPath(hilbertPath);
|
||||
|
||||
|
||||
CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
return 0;
|
||||
@@ -133,14 +133,14 @@ static Vector2 *LoadHilbertPath(int order, float size, int *strokeCount)
|
||||
*strokeCount = N*N;
|
||||
|
||||
Vector2 *hilbertPath = (Vector2 *)RL_CALLOC(*strokeCount, sizeof(Vector2));
|
||||
|
||||
|
||||
for (int i = 0; i < *strokeCount; i++)
|
||||
{
|
||||
hilbertPath[i] = ComputeHilbertStep(order, i);
|
||||
hilbertPath[i].x = hilbertPath[i].x*len + len/2.0f;
|
||||
hilbertPath[i].y = hilbertPath[i].y*len + len/2.0f;
|
||||
}
|
||||
|
||||
|
||||
return hilbertPath;
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ static Vector2 ComputeHilbertStep(int order, int index)
|
||||
[2] = { .x = 1, .y = 1 },
|
||||
[3] = { .x = 1, .y = 0 },
|
||||
};
|
||||
|
||||
|
||||
int hilbertIndex = index&3;
|
||||
Vector2 vect = hilbertPoints[hilbertIndex];
|
||||
float temp = 0.0f;
|
||||
@@ -171,7 +171,7 @@ static Vector2 ComputeHilbertStep(int order, int index)
|
||||
index = index >> 2;
|
||||
hilbertIndex = index&3;
|
||||
len = 1 << j;
|
||||
|
||||
|
||||
switch (hilbertIndex)
|
||||
{
|
||||
case 0:
|
||||
@@ -191,6 +191,6 @@ static Vector2 ComputeHilbertStep(int order, int index)
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return vect;
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ int main(void)
|
||||
if (generations > 0) rebuild = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (rebuild)
|
||||
{
|
||||
RL_FREE(ls.production); // Free previous production for re-creation
|
||||
@@ -118,15 +118,15 @@ int main(void)
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
|
||||
ClearBackground( RAYWHITE );
|
||||
|
||||
|
||||
if (generations > 0) DrawPenroseLSystem(&ls);
|
||||
|
||||
|
||||
DrawText("penrose l-system", 10, 10, 20, DARKGRAY);
|
||||
DrawText("press up or down to change generations", 10, 30, 20, DARKGRAY);
|
||||
DrawText(TextFormat("generations: %d", generations), 10, 50, 20, DARKGRAY);
|
||||
|
||||
|
||||
EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
@@ -171,11 +171,11 @@ static PenroseLSystem CreatePenroseLSystem(float drawLength)
|
||||
.drawLength = drawLength,
|
||||
.theta = 36.0f // Degrees
|
||||
};
|
||||
|
||||
|
||||
ls.production = (char *)RL_MALLOC(sizeof(char)*STR_MAX_SIZE);
|
||||
ls.production[0] = '\0';
|
||||
strncpy(ls.production, "[X]++[X]++[X]++[X]++[X]", STR_MAX_SIZE);
|
||||
|
||||
|
||||
return ls;
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@ static void BuildProductionStep(PenroseLSystem *ls)
|
||||
|
||||
ls->drawLength *= 0.5f;
|
||||
strncpy(ls->production, newProduction, STR_MAX_SIZE);
|
||||
|
||||
|
||||
RL_FREE(newProduction);
|
||||
}
|
||||
|
||||
@@ -228,9 +228,9 @@ static void DrawPenroseLSystem(PenroseLSystem *ls)
|
||||
int repeats = 1;
|
||||
int productionLength = (int)strnlen(ls->production, STR_MAX_SIZE);
|
||||
ls->steps += 12;
|
||||
|
||||
|
||||
if (ls->steps > productionLength) ls->steps = productionLength;
|
||||
|
||||
|
||||
for (int i = 0; i < ls->steps; i++)
|
||||
{
|
||||
char step = ls->production[i];
|
||||
@@ -244,24 +244,24 @@ static void DrawPenroseLSystem(PenroseLSystem *ls)
|
||||
turtle.origin.y += ls->drawLength*sinf(radAngle);
|
||||
Vector2 startPosScreen = { startPosWorld.x + screenCenter.x, startPosWorld.y + screenCenter.y };
|
||||
Vector2 endPosScreen = { turtle.origin.x + screenCenter.x, turtle.origin.y + screenCenter.y };
|
||||
|
||||
|
||||
DrawLineEx(startPosScreen, endPosScreen, 2, Fade(BLACK, 0.2f));
|
||||
}
|
||||
|
||||
|
||||
repeats = 1;
|
||||
}
|
||||
}
|
||||
else if (step == '+')
|
||||
{
|
||||
for (int j = 0; j < repeats; j++) turtle.angle += ls->theta;
|
||||
|
||||
repeats = 1;
|
||||
}
|
||||
}
|
||||
else if (step == '-')
|
||||
{
|
||||
for (int j = 0; j < repeats; j++) turtle.angle += -ls->theta;
|
||||
|
||||
repeats = 1;
|
||||
}
|
||||
}
|
||||
else if (step == '[') PushTurtleState(turtle);
|
||||
else if (step == ']') turtle = PopTurtleState();
|
||||
else if ((step >= 48) && (step <= 57)) repeats = (int) step - 48;
|
||||
|
||||
@@ -33,7 +33,7 @@ typedef struct TextParticle {
|
||||
Vector2 ppos; // Previous position
|
||||
float padding;
|
||||
float borderWidth;
|
||||
float friction;
|
||||
float friction;
|
||||
float elasticity;
|
||||
Color color;
|
||||
bool grabbed;
|
||||
@@ -118,7 +118,7 @@ int main(void)
|
||||
if (IsKeyDown(KEY_LEFT_SHIFT))
|
||||
{
|
||||
ShatterTextParticle(tp, i, textParticles, &particleCount);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SliceTextParticle(tp, i, TextLength(tp->text)/2, textParticles, &particleCount);
|
||||
@@ -158,33 +158,33 @@ int main(void)
|
||||
TextParticle *tp = &textParticles[i];
|
||||
|
||||
// The text particle is not grabbed
|
||||
if (!tp->grabbed)
|
||||
if (!tp->grabbed)
|
||||
{
|
||||
// text particle repositioning using the velocity
|
||||
tp->rect.x += tp->vel.x * delta;
|
||||
tp->rect.y += tp->vel.y * delta;
|
||||
|
||||
// Does the text particle hit the screen right boundary?
|
||||
if ((tp->rect.x + tp->rect.width) >= screenWidth)
|
||||
if ((tp->rect.x + tp->rect.width) >= screenWidth)
|
||||
{
|
||||
tp->rect.x = screenWidth - tp->rect.width; // Text particle repositioning
|
||||
tp->vel.x = -tp->vel.x*tp->elasticity; // Elasticity makes the text particle lose 10% of its velocity on hit
|
||||
}
|
||||
}
|
||||
// Does the text particle hit the screen left boundary?
|
||||
else if (tp->rect.x <= 0)
|
||||
{
|
||||
{
|
||||
tp->rect.x = 0.0f;
|
||||
tp->vel.x = -tp->vel.x*tp->elasticity;
|
||||
}
|
||||
|
||||
// The same for y axis
|
||||
if ((tp->rect.y + tp->rect.height) >= screenHeight)
|
||||
if ((tp->rect.y + tp->rect.height) >= screenHeight)
|
||||
{
|
||||
tp->rect.y = screenHeight - tp->rect.height;
|
||||
tp->vel.y = -tp->vel.y*tp->elasticity;
|
||||
}
|
||||
else if (tp->rect.y <= 0)
|
||||
{
|
||||
}
|
||||
else if (tp->rect.y <= 0)
|
||||
{
|
||||
tp->rect.y = 0.0f;
|
||||
tp->vel.y = -tp->vel.y*tp->elasticity;
|
||||
}
|
||||
@@ -264,9 +264,9 @@ int main(void)
|
||||
void PrepareFirstTextParticle(const char* text, TextParticle *tps, int *particleCount)
|
||||
{
|
||||
tps[0] = CreateTextParticle(
|
||||
text,
|
||||
GetScreenWidth()/2.0f,
|
||||
GetScreenHeight()/2.0f,
|
||||
text,
|
||||
GetScreenWidth()/2.0f,
|
||||
GetScreenHeight()/2.0f,
|
||||
RAYWHITE
|
||||
);
|
||||
*particleCount = 1;
|
||||
@@ -317,7 +317,7 @@ void SliceTextParticleByChar(TextParticle *tp, char charToSlice, TextParticle *t
|
||||
{
|
||||
int tokenCount = 0;
|
||||
char **tokens = TextSplit(tp->text, charToSlice, &tokenCount);
|
||||
|
||||
|
||||
if (tokenCount > 1)
|
||||
{
|
||||
int textLength = TextLength(tp->text);
|
||||
|
||||
@@ -51,7 +51,7 @@ int main(void)
|
||||
{
|
||||
// Unload textures to avoid memory leaks
|
||||
for (int i = 0; i < MAX_TEXTURE_COLLECTION; i++) UnloadTexture(collection[i].texture);
|
||||
|
||||
|
||||
currentCollectionIndex = 0;
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ int main(void)
|
||||
(currentCollectionIndex < MAX_TEXTURE_COLLECTION))
|
||||
{
|
||||
Image image = GetClipboardImage();
|
||||
|
||||
|
||||
if (IsImageValid(image))
|
||||
{
|
||||
collection[currentCollectionIndex].texture = LoadTextureFromImage(image);
|
||||
@@ -76,15 +76,15 @@ int main(void)
|
||||
BeginDrawing();
|
||||
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
|
||||
for (int i = 0; i < currentCollectionIndex; i++)
|
||||
{
|
||||
if (IsTextureValid(collection[i].texture))
|
||||
{
|
||||
DrawTexturePro(collection[i].texture,
|
||||
(Rectangle){0,0,collection[i].texture.width, collection[i].texture.height},
|
||||
DrawTexturePro(collection[i].texture,
|
||||
(Rectangle){0,0,collection[i].texture.width, collection[i].texture.height},
|
||||
(Rectangle){collection[i].position.x,collection[i].position.y,collection[i].texture.width, collection[i].texture.height},
|
||||
(Vector2){collection[i].texture.width*0.5f, collection[i].texture.height*0.5f},
|
||||
(Vector2){collection[i].texture.width*0.5f, collection[i].texture.height*0.5f},
|
||||
0.0f, WHITE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* raylib textures example - magnifying glass
|
||||
*
|
||||
* Example complexity rating: [★★★☆] 3/4
|
||||
*
|
||||
*
|
||||
* Example originally created with raylib 5.6, last time updated with raylib 5.6
|
||||
*
|
||||
* Example contributed by Luke Vaughan (@badram) and reviewed by Ramon Santamaria (@raysan5)
|
||||
@@ -29,18 +29,18 @@ int main(void)
|
||||
const int screenHeight = 450;
|
||||
|
||||
InitWindow(screenWidth, screenHeight, "raylib [textures] example - magnifying glass");
|
||||
|
||||
|
||||
Texture2D bunny = LoadTexture("resources/raybunny.png");
|
||||
Texture2D parrots = LoadTexture("resources/parrots.png");
|
||||
|
||||
|
||||
// Use image draw to generate a mask texture instead of loading it from a file.
|
||||
Image circle = GenImageColor(256, 256, BLANK);
|
||||
ImageDrawCircle(&circle, 128, 128, 128, WHITE);
|
||||
Texture2D mask = LoadTextureFromImage(circle); // Copy the mask image from RAM to VRAM
|
||||
UnloadImage(circle); // Unload the image from RAM
|
||||
|
||||
|
||||
RenderTexture2D magnifiedWorld = LoadRenderTexture(256, 256);
|
||||
|
||||
|
||||
Camera2D camera = { 0 };
|
||||
// Set magnifying glass zoom
|
||||
camera.zoom = 2;
|
||||
@@ -71,7 +71,7 @@ int main(void)
|
||||
DrawTexture(parrots, 144, 33, WHITE);
|
||||
DrawText("Use the magnifying glass to find hidden bunnies!", 154, 6, 20, BLACK);
|
||||
|
||||
// Render to a the magnifying glass
|
||||
// Render to a the magnifying glass
|
||||
BeginTextureMode(magnifiedWorld);
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ int main(void)
|
||||
float hue = t*t;
|
||||
float saturation = t;
|
||||
float value = t;
|
||||
|
||||
|
||||
palette[i] = ColorFromHSV(250.0f + 150.0f*hue, saturation, value);
|
||||
}
|
||||
|
||||
@@ -92,14 +92,14 @@ int main(void)
|
||||
{
|
||||
unsigned int i = x + y*imageWidth;
|
||||
unsigned char colorIndex = indexBuffer[i];
|
||||
|
||||
|
||||
if (colorIndex != 0)
|
||||
{
|
||||
// Move pixel a row above
|
||||
indexBuffer[i] = 0;
|
||||
int moveX = GetRandomValue(0, 2) - 1;
|
||||
int newX = x + moveX;
|
||||
|
||||
|
||||
if ((newX > 0) && (newX < imageWidth))
|
||||
{
|
||||
unsigned int iabove = i - imageWidth + moveX;
|
||||
@@ -130,7 +130,7 @@ int main(void)
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
DrawTextureEx(screenTexture, (Vector2){ 0, 0 }, 0.0f, 2.0f, WHITE);
|
||||
|
||||
58
src/external/rlsw.h
vendored
58
src/external/rlsw.h
vendored
@@ -2281,7 +2281,7 @@ static inline sw_pixel_write_color_f sw_pixel_get_write_color_func(sw_pixelforma
|
||||
{
|
||||
case SW_PIXELFORMAT_COLOR_GRAYSCALE: return sw_pixel_write_color_GRAYSCALE;
|
||||
case SW_PIXELFORMAT_COLOR_GRAYALPHA: return sw_pixel_write_color_GRAYALPHA;
|
||||
case SW_PIXELFORMAT_COLOR_R3G3B2: return sw_pixel_write_color_R3G3B2;
|
||||
case SW_PIXELFORMAT_COLOR_R3G3B2: return sw_pixel_write_color_R3G3B2;
|
||||
case SW_PIXELFORMAT_COLOR_R5G6B5: return sw_pixel_write_color_R5G6B5;
|
||||
case SW_PIXELFORMAT_COLOR_R8G8B8: return sw_pixel_write_color_R8G8B8;
|
||||
case SW_PIXELFORMAT_COLOR_R5G5B5A1: return sw_pixel_write_color_R5G5B5A1;
|
||||
@@ -2472,7 +2472,7 @@ static inline void sw_texture_sample_linear(float *SW_RESTRICT color, const sw_t
|
||||
static inline void sw_texture_sample(float *SW_RESTRICT color, const sw_texture_t *SW_RESTRICT tex,
|
||||
float u, float v, float dUdx, float dUdy, float dVdx, float dVdy)
|
||||
{
|
||||
// NOTE: Commented there is the previous method used
|
||||
// NOTE: Commented there is the previous method used
|
||||
// There was no need to compute the square root because
|
||||
// using the squared value, the comparison remains (L2 > 1.0f*1.0f)
|
||||
//float du = sqrtf(dUdx*dUdx + dUdy*dUdy);
|
||||
@@ -2673,7 +2673,7 @@ static inline void sw_framebuffer_output_copy(void *dst, const sw_texture_t *buf
|
||||
}
|
||||
}
|
||||
|
||||
static inline void sw_framebuffer_output_blit(void *dst, const sw_texture_t *buffer,
|
||||
static inline void sw_framebuffer_output_blit(void *dst, const sw_texture_t *buffer,
|
||||
int xDst, int yDst, int wDst, int hDst, int xSrc, int ySrc, int wSrc, int hSrc, sw_pixelformat_t format)
|
||||
{
|
||||
const uint8_t *srcBase = buffer->pixels;
|
||||
@@ -3007,25 +3007,25 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE BASE
|
||||
#include __FILE__ // IWYU pragma: keep
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE TEX
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE DEPTH
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE BLEND
|
||||
#define SW_ENABLE_BLEND
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE TEX_DEPTH
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
@@ -3033,7 +3033,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE TEX_BLEND
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#define SW_ENABLE_BLEND
|
||||
@@ -3041,7 +3041,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE DEPTH_BLEND
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#define SW_ENABLE_BLEND
|
||||
@@ -3049,7 +3049,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_TRIANGLE TEX_DEPTH_BLEND
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
@@ -3059,7 +3059,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_TRIANGLE
|
||||
|
||||
|
||||
// Dispatch table (auto-generated from SW_RASTER_VARIANTS)
|
||||
#define SW_TABLE_ENTRY(NAME, FLAGS) [FLAGS] = sw_raster_triangle_##NAME,
|
||||
static const sw_raster_triangle_f SW_RASTER_TRIANGLE_TABLE[] = {
|
||||
@@ -3106,25 +3106,25 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD BASE
|
||||
#include __FILE__ // IWYU pragma: keep
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD TEX
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD DEPTH
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD BLEND
|
||||
#define SW_ENABLE_BLEND
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD TEX_DEPTH
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
@@ -3132,7 +3132,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD TEX_BLEND
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#define SW_ENABLE_BLEND
|
||||
@@ -3140,7 +3140,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD DEPTH_BLEND
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#define SW_ENABLE_BLEND
|
||||
@@ -3148,7 +3148,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_QUAD TEX_DEPTH_BLEND
|
||||
#define SW_ENABLE_TEXTURE
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
@@ -3158,7 +3158,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef SW_ENABLE_TEXTURE
|
||||
#undef RLSW_TEMPLATE_RASTER_QUAD
|
||||
|
||||
|
||||
// Dispatch table (auto-generated from SW_RASTER_VARIANTS)
|
||||
#define SW_TABLE_ENTRY(NAME, FLAGS) [FLAGS] = sw_raster_quad_##NAME,
|
||||
static const sw_raster_quad_f SW_RASTER_QUAD_TABLE[] = {
|
||||
@@ -3202,19 +3202,19 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#define RLSW_TEMPLATE_RASTER_LINE BASE
|
||||
#include __FILE__ // IWYU pragma: keep
|
||||
#undef RLSW_TEMPLATE_RASTER_LINE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_LINE DEPTH
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_LINE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_LINE BLEND
|
||||
#define SW_ENABLE_BLEND
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef RLSW_TEMPLATE_RASTER_LINE
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_LINE DEPTH_BLEND
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#define SW_ENABLE_BLEND
|
||||
@@ -3222,7 +3222,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_LINE
|
||||
|
||||
|
||||
// Dispatch table (auto-generated from SW_RASTER_VARIANTS)
|
||||
#define SW_TABLE_ENTRY0(NAME, FLAGS) [FLAGS] = sw_raster_line_##NAME,
|
||||
#define SW_TABLE_ENTRY1(NAME, FLAGS) [FLAGS] = sw_raster_line_thick_##NAME,
|
||||
@@ -3266,19 +3266,19 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#define RLSW_TEMPLATE_RASTER_POINT BASE
|
||||
#include __FILE__ // IWYU pragma: keep
|
||||
#undef RLSW_TEMPLATE_RASTER_POINT
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_POINT DEPTH
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_POINT
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_POINT BLEND
|
||||
#define SW_ENABLE_BLEND
|
||||
#include __FILE__
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef RLSW_TEMPLATE_RASTER_POINT
|
||||
|
||||
|
||||
#define RLSW_TEMPLATE_RASTER_POINT DEPTH_BLEND
|
||||
#define SW_ENABLE_DEPTH_TEST
|
||||
#define SW_ENABLE_BLEND
|
||||
@@ -3286,7 +3286,7 @@ static bool sw_polygon_clip(sw_vertex_t polygon[SW_MAX_CLIPPED_POLYGON_VERTICES]
|
||||
#undef SW_ENABLE_BLEND
|
||||
#undef SW_ENABLE_DEPTH_TEST
|
||||
#undef RLSW_TEMPLATE_RASTER_POINT
|
||||
|
||||
|
||||
// Dispatch table (auto-generated from SW_RASTER_VARIANTS)
|
||||
#define SW_TABLE_ENTRY(NAME, FLAGS) [FLAGS] = sw_raster_point_##NAME,
|
||||
static const sw_raster_point_f SW_RASTER_POINT_TABLE[] = {
|
||||
@@ -5171,7 +5171,7 @@ void swFramebufferTexture2D(SWattachment attach, uint32_t texture)
|
||||
RLSW.colorBuffer = sw_pool_get(&RLSW.texturePool, texture);
|
||||
} break;
|
||||
case SW_DEPTH_ATTACHMENT:
|
||||
{
|
||||
{
|
||||
fb->depthAttachment = texture;
|
||||
RLSW.depthBuffer = sw_pool_get(&RLSW.texturePool, texture);
|
||||
} break;
|
||||
@@ -5262,7 +5262,7 @@ void swGetFramebufferAttachmentParameteriv(SWattachment attachment, SWattachget
|
||||
|
||||
static void SW_RASTER_TRIANGLE_SPAN(const sw_vertex_t *start, const sw_vertex_t *end, float dUdy, float dVdy)
|
||||
{
|
||||
// Gets the start/end coordinates and skip empty lines
|
||||
// Gets the start/end coordinates and skip empty lines
|
||||
int xStart = (int)start->position[0];
|
||||
int xEnd = (int)end->position[0];
|
||||
if (xStart == xEnd) return;
|
||||
|
||||
@@ -684,7 +684,7 @@ void InitWindow(int width, int height, const char *title)
|
||||
}
|
||||
|
||||
// Initialize render dimensions for embedded platforms
|
||||
// NOTE: On desktop platforms (GLFW, SDL, etc.), CORE.Window.render.width/height are set during window creation
|
||||
// NOTE: On desktop platforms (GLFW, SDL, etc.), CORE.Window.render.width/height are set during window creation
|
||||
// On embedded platforms with no window manager, InitPlatform() doesn't set these values, so they should be initialized
|
||||
// here from screen dimensions (which are set from the InitWindow parameters)
|
||||
if ((CORE.Window.render.width == 0) || (CORE.Window.render.height == 0))
|
||||
|
||||
@@ -2265,7 +2265,6 @@ int GetCodepoint(const char *text, int *codepointSize)
|
||||
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
*/
|
||||
|
||||
|
||||
int codepoint = 0x3f; // Codepoint (defaults to '?')
|
||||
*codepointSize = 1;
|
||||
if (text == NULL) return codepoint;
|
||||
|
||||
Reference in New Issue
Block a user