|
@ -2331,6 +2331,202 @@ void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, V |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle destRec, Vector2 origin, float rotation, Color tint) |
|
|
|
|
|
{ |
|
|
|
|
|
if (texture.id > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
float width = (float)texture.width; |
|
|
|
|
|
float height = (float)texture.height; |
|
|
|
|
|
|
|
|
|
|
|
float patchWidth = (destRec.width <= 0.0f)? 0.0f : destRec.width; |
|
|
|
|
|
float patchHeight = (destRec.height <= 0.0f)? 0.0f : destRec.height; |
|
|
|
|
|
|
|
|
|
|
|
if (nPatchInfo.sourceRec.width < 0) nPatchInfo.sourceRec.x -= nPatchInfo.sourceRec.width; |
|
|
|
|
|
if (nPatchInfo.sourceRec.height < 0) nPatchInfo.sourceRec.y -= nPatchInfo.sourceRec.height; |
|
|
|
|
|
if (nPatchInfo.type == NPT_3PATCH_HORIZONTAL) patchHeight = nPatchInfo.sourceRec.height; |
|
|
|
|
|
if (nPatchInfo.type == NPT_3PATCH_VERTICAL) patchWidth = nPatchInfo.sourceRec.width; |
|
|
|
|
|
|
|
|
|
|
|
bool drawCenter = true; |
|
|
|
|
|
bool drawMiddle = true; |
|
|
|
|
|
float leftBorder = (float)nPatchInfo.left; |
|
|
|
|
|
float topBorder = (float)nPatchInfo.top; |
|
|
|
|
|
float rightBorder = (float)nPatchInfo.right; |
|
|
|
|
|
float bottomBorder = (float)nPatchInfo.bottom; |
|
|
|
|
|
|
|
|
|
|
|
// adjust the lateral (left and right) border widths in case patchWidth < texture.width |
|
|
|
|
|
if (patchWidth <= (leftBorder + rightBorder) && nPatchInfo.type != NPT_3PATCH_VERTICAL) |
|
|
|
|
|
{ |
|
|
|
|
|
drawCenter = false; |
|
|
|
|
|
leftBorder = (leftBorder / (leftBorder + rightBorder)) * patchWidth; |
|
|
|
|
|
rightBorder = patchWidth - leftBorder; |
|
|
|
|
|
} |
|
|
|
|
|
// adjust the lateral (top and bottom) border heights in case patchHeight < texture.height |
|
|
|
|
|
if (patchHeight <= (topBorder + bottomBorder) && nPatchInfo.type != NPT_3PATCH_HORIZONTAL) |
|
|
|
|
|
{ |
|
|
|
|
|
drawMiddle = false; |
|
|
|
|
|
topBorder = (topBorder / (topBorder + bottomBorder)) * patchHeight; |
|
|
|
|
|
bottomBorder = patchHeight - topBorder; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Vector2 vertA, vertB, vertC, vertD; |
|
|
|
|
|
vertA.x = 0.0f; // outer left |
|
|
|
|
|
vertA.y = 0.0f; // outer top |
|
|
|
|
|
vertB.x = leftBorder; // inner left |
|
|
|
|
|
vertB.y = topBorder; // inner top |
|
|
|
|
|
vertC.x = patchWidth - rightBorder; // inner right |
|
|
|
|
|
vertC.y = patchHeight - bottomBorder; // inner bottom |
|
|
|
|
|
vertD.x = patchWidth; // outer right |
|
|
|
|
|
vertD.y = patchHeight; // outer bottom |
|
|
|
|
|
|
|
|
|
|
|
Vector2 coordA, coordB, coordC, coordD; |
|
|
|
|
|
coordA.x = nPatchInfo.sourceRec.x / width; |
|
|
|
|
|
coordA.y = nPatchInfo.sourceRec.y / height; |
|
|
|
|
|
coordB.x = (nPatchInfo.sourceRec.x + leftBorder) / width; |
|
|
|
|
|
coordB.y = (nPatchInfo.sourceRec.y + topBorder) / height; |
|
|
|
|
|
coordC.x = (nPatchInfo.sourceRec.x + nPatchInfo.sourceRec.width - rightBorder) / width; |
|
|
|
|
|
coordC.y = (nPatchInfo.sourceRec.y + nPatchInfo.sourceRec.height - bottomBorder) / height; |
|
|
|
|
|
coordD.x = (nPatchInfo.sourceRec.x + nPatchInfo.sourceRec.width) / width; |
|
|
|
|
|
coordD.y = (nPatchInfo.sourceRec.y + nPatchInfo.sourceRec.height) / height; |
|
|
|
|
|
|
|
|
|
|
|
rlEnableTexture(texture.id); |
|
|
|
|
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
|
|
rlTranslatef(destRec.x, destRec.y, 0); |
|
|
|
|
|
rlRotatef(rotation, 0, 0, 1); |
|
|
|
|
|
rlTranslatef(-origin.x, -origin.y, 0); |
|
|
|
|
|
|
|
|
|
|
|
rlBegin(RL_QUADS); |
|
|
|
|
|
rlColor4ub(tint.r, tint.g, tint.b, tint.a); |
|
|
|
|
|
rlNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer |
|
|
|
|
|
|
|
|
|
|
|
if (nPatchInfo.type == NPT_9PATCH) |
|
|
|
|
|
{ |
|
|
|
|
|
// ------------------------------------------------------------ |
|
|
|
|
|
// TOP-LEFT QUAD |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordB.y); rlVertex2f(vertA.x, vertB.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordB.y); rlVertex2f(vertB.x, vertB.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordA.y); rlVertex2f(vertB.x, vertA.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordA.y); rlVertex2f(vertA.x, vertA.y); // Top-left corner for texture and quad |
|
|
|
|
|
if (drawCenter) |
|
|
|
|
|
{ |
|
|
|
|
|
// TOP-CENTER QUAD |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordB.y); rlVertex2f(vertB.x, vertB.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordB.y); rlVertex2f(vertC.x, vertB.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordA.y); rlVertex2f(vertC.x, vertA.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordA.y); rlVertex2f(vertB.x, vertA.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
// TOP-RIGHT QUAD |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordB.y); rlVertex2f(vertC.x, vertB.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordB.y); rlVertex2f(vertD.x, vertB.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordA.y); rlVertex2f(vertD.x, vertA.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordA.y); rlVertex2f(vertC.x, vertA.y); // Top-left corner for texture and quad |
|
|
|
|
|
if (drawMiddle) |
|
|
|
|
|
{ |
|
|
|
|
|
// ------------------------------------------------------------ |
|
|
|
|
|
// MIDDLE-LEFT QUAD |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordC.y); rlVertex2f(vertA.x, vertC.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordC.y); rlVertex2f(vertB.x, vertC.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordB.y); rlVertex2f(vertB.x, vertB.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordB.y); rlVertex2f(vertA.x, vertB.y); // Top-left corner for texture and quad |
|
|
|
|
|
if (drawCenter) |
|
|
|
|
|
{ |
|
|
|
|
|
// MIDDLE-CENTER QUAD |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordC.y); rlVertex2f(vertB.x, vertC.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordC.y); rlVertex2f(vertC.x, vertC.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordB.y); rlVertex2f(vertC.x, vertB.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordB.y); rlVertex2f(vertB.x, vertB.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// MIDDLE-RIGHT QUAD |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordC.y); rlVertex2f(vertC.x, vertC.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordB.y); rlVertex2f(vertD.x, vertB.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordB.y); rlVertex2f(vertC.x, vertB.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ------------------------------------------------------------ |
|
|
|
|
|
// BOTTOM-LEFT QUAD |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordD.y); rlVertex2f(vertA.x, vertD.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordD.y); rlVertex2f(vertB.x, vertD.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordC.y); rlVertex2f(vertB.x, vertC.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordC.y); rlVertex2f(vertA.x, vertC.y); // Top-left corner for texture and quad |
|
|
|
|
|
if (drawCenter) |
|
|
|
|
|
{ |
|
|
|
|
|
// BOTTOM-CENTER QUAD |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordD.y); rlVertex2f(vertB.x, vertD.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordD.y); rlVertex2f(vertC.x, vertD.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordC.y); rlVertex2f(vertC.x, vertC.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordC.y); rlVertex2f(vertB.x, vertC.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// BOTTOM-RIGHT QUAD |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordD.y); rlVertex2f(vertC.x, vertD.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordD.y); rlVertex2f(vertD.x, vertD.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordC.y); rlVertex2f(vertC.x, vertC.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
else if (nPatchInfo.type == NPT_3PATCH_VERTICAL) |
|
|
|
|
|
{ |
|
|
|
|
|
// TOP QUAD |
|
|
|
|
|
// ----------------------------------------------------------- |
|
|
|
|
|
// Texture coords Vertices |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordB.y); rlVertex2f(vertA.x, vertB.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordB.y); rlVertex2f(vertD.x, vertB.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordA.y); rlVertex2f(vertD.x, vertA.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordA.y); rlVertex2f(vertA.x, vertA.y); // Top-left corner for texture and quad |
|
|
|
|
|
if (drawCenter) |
|
|
|
|
|
{ |
|
|
|
|
|
// MIDDLE QUAD |
|
|
|
|
|
// ----------------------------------------------------------- |
|
|
|
|
|
// Texture coords Vertices |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordC.y); rlVertex2f(vertA.x, vertC.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordB.y); rlVertex2f(vertD.x, vertB.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordB.y); rlVertex2f(vertA.x, vertB.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
// BOTTOM QUAD |
|
|
|
|
|
// ----------------------------------------------------------- |
|
|
|
|
|
// Texture coords Vertices |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordD.y); rlVertex2f(vertA.x, vertD.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordD.y); rlVertex2f(vertD.x, vertD.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordC.y); rlVertex2f(vertD.x, vertC.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordC.y); rlVertex2f(vertA.x, vertC.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
else if (nPatchInfo.type == NPT_3PATCH_HORIZONTAL) |
|
|
|
|
|
{ |
|
|
|
|
|
// LEFT QUAD |
|
|
|
|
|
// ----------------------------------------------------------- |
|
|
|
|
|
// Texture coords Vertices |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordD.y); rlVertex2f(vertA.x, vertD.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordD.y); rlVertex2f(vertB.x, vertD.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordA.y); rlVertex2f(vertB.x, vertA.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordA.x, coordA.y); rlVertex2f(vertA.x, vertA.y); // Top-left corner for texture and quad |
|
|
|
|
|
if (drawCenter) |
|
|
|
|
|
{ |
|
|
|
|
|
// CENTER QUAD |
|
|
|
|
|
// ----------------------------------------------------------- |
|
|
|
|
|
// Texture coords Vertices |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordD.y); rlVertex2f(vertB.x, vertD.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordD.y); rlVertex2f(vertC.x, vertD.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordA.y); rlVertex2f(vertC.x, vertA.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordB.x, coordA.y); rlVertex2f(vertB.x, vertA.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
// RIGHT QUAD |
|
|
|
|
|
// ----------------------------------------------------------- |
|
|
|
|
|
// Texture coords Vertices |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordD.y); rlVertex2f(vertC.x, vertD.y); // Bottom-left corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordD.y); rlVertex2f(vertD.x, vertD.y); // Bottom-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordD.x, coordA.y); rlVertex2f(vertD.x, vertA.y); // Top-right corner for texture and quad |
|
|
|
|
|
rlTexCoord2f(coordC.x, coordA.y); rlVertex2f(vertC.x, vertA.y); // Top-left corner for texture and quad |
|
|
|
|
|
} |
|
|
|
|
|
rlEnd(); |
|
|
|
|
|
rlPopMatrix(); |
|
|
|
|
|
|
|
|
|
|
|
rlDisableTexture(); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
//---------------------------------------------------------------------------------- |
|
|
// Module specific Functions Definition |
|
|
// Module specific Functions Definition |
|
|
//---------------------------------------------------------------------------------- |
|
|
//---------------------------------------------------------------------------------- |
|
|