|
@@ -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
|
|
|
//----------------------------------------------------------------------------------
|