mirror of
https://github.com/Kapendev/parin.git
synced 2025-04-26 21:19:56 +03:00
New engine font and UI is flooring.
This commit is contained in:
parent
419451f650
commit
65f800f595
8 changed files with 25 additions and 15 deletions
4
assets/README.md
Normal file
4
assets/README.md
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# Assets
|
||||||
|
|
||||||
|
* [Atlas](atlas.png): By [Kapendev](https://kapendev.itch.io), CC0
|
||||||
|
* [Monogram](monogram.png): By [DATAGOBLIN](https://datagoblin.itch.io/monogram), CC0
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
BIN
assets/monogram.png
Normal file
BIN
assets/monogram.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
3
dub.json
3
dub.json
|
@ -9,6 +9,9 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"joka": "*"
|
"joka": "*"
|
||||||
},
|
},
|
||||||
|
"stringImportPaths": [
|
||||||
|
"assets"
|
||||||
|
],
|
||||||
"subPackages" : [
|
"subPackages" : [
|
||||||
"setup",
|
"setup",
|
||||||
"web"
|
"web"
|
||||||
|
|
|
@ -4,7 +4,7 @@ This folder provides example projects to help you get started.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> If an example uses textures,
|
> If an example uses textures,
|
||||||
> be sure to download the [atlas.png](atlas.png) file and place it in the project's assets folder.
|
> be sure to download the [atlas.png](../assets/atlas.png) file and place it in the project's assets folder.
|
||||||
|
|
||||||
## Categories
|
## Categories
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ bool update(float dt) {
|
||||||
setUiFocus(0);
|
setUiFocus(0);
|
||||||
setUiStartPoint(Vec2(8));
|
setUiStartPoint(Vec2(8));
|
||||||
// Toggle the limit of the drag handle.
|
// Toggle the limit of the drag handle.
|
||||||
if (uiButton(Vec2(80, 30), "Limit: {}".format(handleOptions.dragLimit))) {
|
if (uiButton(Vec2(100, 30), "Limit: {}".format(handleOptions.dragLimit))) {
|
||||||
if (handleOptions.dragLimit) handleOptions.dragLimit = UiDragLimit.none;
|
if (handleOptions.dragLimit) handleOptions.dragLimit = UiDragLimit.none;
|
||||||
else handleOptions.dragLimit = UiDragLimit.viewport;
|
else handleOptions.dragLimit = UiDragLimit.viewport;
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,6 +169,7 @@ enum Mouse : ubyte {
|
||||||
|
|
||||||
/// A type representing a limited set of gamepad buttons.
|
/// A type representing a limited set of gamepad buttons.
|
||||||
enum Gamepad : ubyte {
|
enum Gamepad : ubyte {
|
||||||
|
none = rl.GAMEPAD_BUTTON_UNKNOWN, /// Not a button.
|
||||||
left = rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT, /// The left button.
|
left = rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT, /// The left button.
|
||||||
right = rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT, /// The right button.
|
right = rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT, /// The right button.
|
||||||
up = rl.GAMEPAD_BUTTON_LEFT_FACE_UP, /// The up button.
|
up = rl.GAMEPAD_BUTTON_LEFT_FACE_UP, /// The up button.
|
||||||
|
@ -973,6 +974,7 @@ struct EngineState {
|
||||||
EngineResources resources;
|
EngineResources resources;
|
||||||
EngineFullscreenState fullscreenState;
|
EngineFullscreenState fullscreenState;
|
||||||
|
|
||||||
|
Font font;
|
||||||
Color borderColor;
|
Color borderColor;
|
||||||
Sz tickCount;
|
Sz tickCount;
|
||||||
LStr assetsPath;
|
LStr assetsPath;
|
||||||
|
@ -995,6 +997,7 @@ struct EngineState {
|
||||||
// }
|
// }
|
||||||
viewport.free();
|
viewport.free();
|
||||||
resources.free();
|
resources.free();
|
||||||
|
font.free();
|
||||||
tempText.free();
|
tempText.free();
|
||||||
assetsPath.free();
|
assetsPath.free();
|
||||||
this = EngineState();
|
this = EngineState();
|
||||||
|
@ -1106,17 +1109,16 @@ rl.Camera2D toRl(Camera camera, Viewport viewport = Viewport()) {
|
||||||
/// Converts an ASCII bitmap font texture into a font.
|
/// Converts an ASCII bitmap font texture into a font.
|
||||||
/// The texture will be freed when the font is freed.
|
/// The texture will be freed when the font is freed.
|
||||||
// NOTE: The number of items allocated for this font is calculated as: (font width / tile width) * (font height / tile height)
|
// NOTE: The number of items allocated for this font is calculated as: (font width / tile width) * (font height / tile height)
|
||||||
|
// NOTE: This function assumes that raylib uses malloc.
|
||||||
@trusted
|
@trusted
|
||||||
Font toFont(Texture texture, int tileWidth, int tileHeight) {
|
Font toFont(Texture texture, int tileWidth, int tileHeight) {
|
||||||
if (texture.isEmpty || tileWidth <= 0|| tileHeight <= 0) return Font();
|
if (texture.isEmpty || tileWidth <= 0|| tileHeight <= 0) return Font();
|
||||||
|
|
||||||
auto result = Font();
|
auto result = Font();
|
||||||
result.lineSpacing = tileHeight;
|
result.lineSpacing = tileHeight;
|
||||||
|
|
||||||
auto rowCount = texture.height / tileHeight;
|
auto rowCount = texture.height / tileHeight;
|
||||||
auto colCount = texture.width / tileWidth;
|
auto colCount = texture.width / tileWidth;
|
||||||
auto maxCount = rowCount * colCount;
|
auto maxCount = rowCount * colCount;
|
||||||
|
|
||||||
result.data.baseSize = tileHeight;
|
result.data.baseSize = tileHeight;
|
||||||
result.data.glyphCount = maxCount;
|
result.data.glyphCount = maxCount;
|
||||||
result.data.glyphPadding = 0;
|
result.data.glyphPadding = 0;
|
||||||
|
@ -1291,7 +1293,7 @@ TextureId loadTexture(IStr path, Sz tag = 0) {
|
||||||
Result!Font loadRawFont(IStr path, int size, int runeSpacing, int lineSpacing, IStr32 runes = "") {
|
Result!Font loadRawFont(IStr path, int size, int runeSpacing, int lineSpacing, IStr32 runes = "") {
|
||||||
auto targetPath = canUseAssetsPath ? path.toAssetsPath() : path;
|
auto targetPath = canUseAssetsPath ? path.toAssetsPath() : path;
|
||||||
auto value = rl.LoadFontEx(targetPath.toCStr().getOr(), size, runes == "" ? null : cast(int*) runes.ptr, cast(int) runes.length).toParin();
|
auto value = rl.LoadFontEx(targetPath.toCStr().getOr(), size, runes == "" ? null : cast(int*) runes.ptr, cast(int) runes.length).toParin();
|
||||||
if (value.data.texture.id == engineFont.data.texture.id) {
|
if (value.data.texture.id == rl.GetFontDefault().texture.id) {
|
||||||
value = Font();
|
value = Font();
|
||||||
}
|
}
|
||||||
value.runeSpacing = runeSpacing;
|
value.runeSpacing = runeSpacing;
|
||||||
|
@ -1420,9 +1422,7 @@ void openUrl(IStr url = "https://github.com/Kapendev/parin") {
|
||||||
/// You should avoid calling this function manually.
|
/// You should avoid calling this function manually.
|
||||||
@trusted
|
@trusted
|
||||||
void openWindow(int width, int height, IStr appPath, IStr title = "Parin") {
|
void openWindow(int width, int height, IStr appPath, IStr title = "Parin") {
|
||||||
if (rl.IsWindowReady) {
|
if (rl.IsWindowReady) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
rl.SetConfigFlags(rl.FLAG_WINDOW_RESIZABLE | rl.FLAG_VSYNC_HINT);
|
rl.SetConfigFlags(rl.FLAG_WINDOW_RESIZABLE | rl.FLAG_VSYNC_HINT);
|
||||||
rl.SetTraceLogLevel(rl.LOG_ERROR);
|
rl.SetTraceLogLevel(rl.LOG_ERROR);
|
||||||
rl.InitWindow(width, height, title.toCStr().getOr());
|
rl.InitWindow(width, height, title.toCStr().getOr());
|
||||||
|
@ -1438,6 +1438,12 @@ void openWindow(int width, int height, IStr appPath, IStr title = "Parin") {
|
||||||
engineState.tempText.reserve(8192);
|
engineState.tempText.reserve(8192);
|
||||||
// NOTE: This line is used for fixing an alpha bug with render textures.
|
// NOTE: This line is used for fixing an alpha bug with render textures.
|
||||||
rl.rlSetBlendFactorsSeparate(0x0302, 0x0303, 1, 0x0303, 0x8006, 0x8006);
|
rl.rlSetBlendFactorsSeparate(0x0302, 0x0303, 1, 0x0303, 0x8006, 0x8006);
|
||||||
|
// Load default engine assets.
|
||||||
|
auto monogramData = cast(const(ubyte)[]) import("monogram.png");
|
||||||
|
auto monogramImage = rl.LoadImageFromMemory(".png", monogramData.ptr, cast(int) monogramData.length);
|
||||||
|
auto monogramTexture = rl.LoadTextureFromImage(monogramImage);
|
||||||
|
engineState.font = monogramTexture.toParin().toFont(6, 12);
|
||||||
|
rl.UnloadImage(monogramImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Updates the window every frame with the given function.
|
/// Updates the window every frame with the given function.
|
||||||
|
@ -1668,10 +1674,7 @@ void setBorderColor(Color value) {
|
||||||
/// Returns the default engine font. This font should not be freed.
|
/// Returns the default engine font. This font should not be freed.
|
||||||
@trusted
|
@trusted
|
||||||
Font engineFont() {
|
Font engineFont() {
|
||||||
auto result = rl.GetFontDefault().toParin();
|
return engineState.font;
|
||||||
result.runeSpacing = 1;
|
|
||||||
result.lineSpacing = 10;
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the default filter mode for textures.
|
/// Returns the default filter mode for textures.
|
||||||
|
|
|
@ -358,10 +358,10 @@ void drawUiText(Vec2 size, IStr text, Vec2 point, UiOptions options = UiOptions(
|
||||||
case Alignment.center: break;
|
case Alignment.center: break;
|
||||||
case Alignment.right: textPoint.x -= options.alignmentOffset; break;
|
case Alignment.right: textPoint.x -= options.alignmentOffset; break;
|
||||||
}
|
}
|
||||||
auto textOptions = DrawOptions(options.alignment, cast(int) size.x.round());
|
auto textOptions = DrawOptions(options.alignment, cast(int) size.x.floor());
|
||||||
textOptions.hook = Hook.center;
|
textOptions.hook = Hook.center;
|
||||||
if (options.isDisabled) textOptions.color.a = defaultUiAlpha;
|
if (options.isDisabled) textOptions.color.a = defaultUiAlpha;
|
||||||
drawText(font, text, textPoint.round(), textOptions);
|
drawText(font, text, textPoint.floor(), textOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiText(Vec2 size, IStr text, UiOptions options = UiOptions()) {
|
void uiText(Vec2 size, IStr text, UiOptions options = UiOptions()) {
|
||||||
|
@ -581,7 +581,7 @@ void drawUiTextField(Vec2 size, Str text, Vec2 point, UiOptions options = UiOpti
|
||||||
if (!options.isDisabled) {
|
if (!options.isDisabled) {
|
||||||
auto rect = Rect(textPoint.x + textSize.x + 1.0f, textPoint.y, font.size * 0.05f, font.size).area(Hook.center);
|
auto rect = Rect(textPoint.x + textSize.x + 1.0f, textPoint.y, font.size * 0.05f, font.size).area(Hook.center);
|
||||||
rect.subTopBottom(rect.size.y * 0.1f);
|
rect.subTopBottom(rect.size.y * 0.1f);
|
||||||
rect = rect.round();
|
rect = rect.floor();
|
||||||
if (rect.size.x == 0.0f) rect.size.x = 1.0f;
|
if (rect.size.x == 0.0f) rect.size.x = 1.0f;
|
||||||
drawRect(rect, defaultUiDisabledColor);
|
drawRect(rect, defaultUiDisabledColor);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue