mirror of
https://github.com/Kapendev/parin.git
synced 2025-05-02 07:59:57 +03:00
Removing opCast so I can have a happy life.
This commit is contained in:
parent
fe4b4157d2
commit
7846b4adb8
4 changed files with 88 additions and 56 deletions
|
@ -305,13 +305,13 @@ struct TextureId {
|
||||||
|
|
||||||
/// Checks if the resource identifier is valid. It becomes automatically invalid when the resource is freed.
|
/// Checks if the resource identifier is valid. It becomes automatically invalid when the resource is freed.
|
||||||
bool isValid() {
|
bool isValid() {
|
||||||
return data && engineState.textures.has(GenerationalIndex(data.value - 1, data.generation));
|
return data.value && engineState.textures.has(GenerationalIndex(data.value - 1, data.generation));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Retrieves the texture associated with the resource identifier.
|
/// Retrieves the texture associated with the resource identifier.
|
||||||
ref Texture get() {
|
ref Texture get() {
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
if (data) {
|
if (data.value) {
|
||||||
assert(0, "ID `{}` with generation `{}` does not exist.".format(data.value, data.generation));
|
assert(0, "ID `{}` with generation `{}` does not exist.".format(data.value, data.generation));
|
||||||
} else {
|
} else {
|
||||||
assert(0, "ID `0` is always invalid and represents a resource that was never created.");
|
assert(0, "ID `0` is always invalid and represents a resource that was never created.");
|
||||||
|
@ -408,13 +408,13 @@ struct FontId {
|
||||||
|
|
||||||
/// Checks if the resource identifier is valid. It becomes automatically invalid when the resource is freed.
|
/// Checks if the resource identifier is valid. It becomes automatically invalid when the resource is freed.
|
||||||
bool isValid() {
|
bool isValid() {
|
||||||
return data && engineState.fonts.has(GenerationalIndex(data.value - 1, data.generation));
|
return data.value && engineState.fonts.has(GenerationalIndex(data.value - 1, data.generation));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Retrieves the font associated with the resource identifier.
|
/// Retrieves the font associated with the resource identifier.
|
||||||
ref Font get() {
|
ref Font get() {
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
if (data) {
|
if (data.value) {
|
||||||
assert(0, "ID `{}` with generation `{}` does not exist.".format(data.value, data.generation));
|
assert(0, "ID `{}` with generation `{}` does not exist.".format(data.value, data.generation));
|
||||||
} else {
|
} else {
|
||||||
assert(0, "ID `0` is always invalid and represents a resource that was never created.");
|
assert(0, "ID `0` is always invalid and represents a resource that was never created.");
|
||||||
|
@ -579,13 +579,13 @@ struct SoundId {
|
||||||
|
|
||||||
/// Checks if the resource identifier is valid. It becomes automatically invalid when the resource is freed.
|
/// Checks if the resource identifier is valid. It becomes automatically invalid when the resource is freed.
|
||||||
bool isValid() {
|
bool isValid() {
|
||||||
return data && engineState.sounds.has(GenerationalIndex(data.value - 1, data.generation));
|
return data.value && engineState.sounds.has(GenerationalIndex(data.value - 1, data.generation));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Retrieves the sound associated with the resource identifier.
|
/// Retrieves the sound associated with the resource identifier.
|
||||||
ref Sound get() {
|
ref Sound get() {
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
if (data) {
|
if (data.value) {
|
||||||
assert(0, "ID `{}` with generation `{}` does not exist.".format(data.value, data.generation));
|
assert(0, "ID `{}` with generation `{}` does not exist.".format(data.value, data.generation));
|
||||||
} else {
|
} else {
|
||||||
assert(0, "ID `0` is always invalid and represents a resource that was never created.");
|
assert(0, "ID `0` is always invalid and represents a resource that was never created.");
|
||||||
|
@ -1156,12 +1156,11 @@ Result!Texture loadRawTexture(IStr path) {
|
||||||
/// The resource is managed by the engine and can be freed manually or with the `freeResources` function.
|
/// The resource is managed by the engine and can be freed manually or with the `freeResources` function.
|
||||||
/// Supports both forward slashes and backslashes in file paths.
|
/// Supports both forward slashes and backslashes in file paths.
|
||||||
TextureId loadTexture(IStr path) {
|
TextureId loadTexture(IStr path) {
|
||||||
if (auto resource = loadRawTexture(path)) {
|
auto resource = loadRawTexture(path);
|
||||||
auto id = TextureId(engineState.textures.append(resource.get()));
|
if (resource.isNone) return TextureId();
|
||||||
id.data.value += 1;
|
auto id = TextureId(engineState.textures.append(resource.get()));
|
||||||
return id;
|
id.data.value += 1;
|
||||||
}
|
return id;
|
||||||
return TextureId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads a font file (TTF, OTF) from the assets folder.
|
/// Loads a font file (TTF, OTF) from the assets folder.
|
||||||
|
@ -1185,12 +1184,11 @@ Result!Font loadRawFont(IStr path, int size, int runeSpacing, int lineSpacing, I
|
||||||
/// The resource is managed by the engine and can be freed manually or with the `freeResources` function.
|
/// The resource is managed by the engine and can be freed manually or with the `freeResources` function.
|
||||||
/// Supports both forward slashes and backslashes in file paths.
|
/// Supports both forward slashes and backslashes in file paths.
|
||||||
FontId loadFont(IStr path, int size, int runeSpacing, int lineSpacing, IStr32 runes = "") {
|
FontId loadFont(IStr path, int size, int runeSpacing, int lineSpacing, IStr32 runes = "") {
|
||||||
if (auto resource = loadRawFont(path, size, runeSpacing, lineSpacing, runes)) {
|
auto resource = loadRawFont(path, size, runeSpacing, lineSpacing, runes);
|
||||||
auto id = FontId(engineState.fonts.append(resource.get()));
|
if (resource.isNone) return FontId();
|
||||||
id.data.value += 1;
|
auto id = FontId(engineState.fonts.append(resource.get()));
|
||||||
return id;
|
id.data.value += 1;
|
||||||
}
|
return id;
|
||||||
return FontId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads an ASCII bitmap font file (PNG) from the assets folder.
|
/// Loads an ASCII bitmap font file (PNG) from the assets folder.
|
||||||
|
@ -1207,12 +1205,11 @@ Result!Font loadRawFontFromTexture(IStr path, int tileWidth, int tileHeight) {
|
||||||
/// Supports both forward slashes and backslashes in file paths.
|
/// Supports both forward slashes and backslashes in file paths.
|
||||||
// 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)
|
||||||
FontId loadFontFromTexture(IStr path, int tileWidth, int tileHeight) {
|
FontId loadFontFromTexture(IStr path, int tileWidth, int tileHeight) {
|
||||||
if (auto resource = loadRawFontFromTexture(path, tileWidth, tileHeight)) {
|
auto resource = loadRawFontFromTexture(path, tileWidth, tileHeight);
|
||||||
auto id = FontId(engineState.fonts.append(resource.get()));
|
if (resource.isNone) return FontId();
|
||||||
id.data.value += 1;
|
auto id = FontId(engineState.fonts.append(resource.get()));
|
||||||
return id;
|
id.data.value += 1;
|
||||||
}
|
return id;
|
||||||
return FontId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads a sound file (WAV, OGG, MP3) from the assets folder.
|
/// Loads a sound file (WAV, OGG, MP3) from the assets folder.
|
||||||
|
@ -1236,12 +1233,11 @@ Result!Sound loadRawSound(IStr path, float volume, float pitch) {
|
||||||
/// The resource is managed by the engine and can be freed manually or with the `freeResources` function.
|
/// The resource is managed by the engine and can be freed manually or with the `freeResources` function.
|
||||||
/// Supports both forward slashes and backslashes in file paths.
|
/// Supports both forward slashes and backslashes in file paths.
|
||||||
SoundId loadSound(IStr path, float volume, float pitch) {
|
SoundId loadSound(IStr path, float volume, float pitch) {
|
||||||
if (auto resource = loadRawSound(path, volume, pitch)) {
|
auto resource = loadRawSound(path, volume, pitch);
|
||||||
auto id = SoundId(engineState.sounds.append(resource.get()));
|
if (resource.isNone) return SoundId();
|
||||||
id.data.value += 1;
|
auto id = SoundId(engineState.sounds.append(resource.get()));
|
||||||
return id;
|
id.data.value += 1;
|
||||||
}
|
return id;
|
||||||
return SoundId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Saves a text file to the assets folder.
|
/// Saves a text file to the assets folder.
|
||||||
|
@ -2290,8 +2286,8 @@ void drawRune(FontId font, dchar rune, Vec2 position, DrawOptions options = Draw
|
||||||
// NOTE: Text drawing needs to go over the text 3 times. This can be made into 2 times in the future if needed by copy-pasting the measureTextSize inside this function.
|
// NOTE: Text drawing needs to go over the text 3 times. This can be made into 2 times in the future if needed by copy-pasting the measureTextSize inside this function.
|
||||||
@trusted
|
@trusted
|
||||||
void drawText(Font font, IStr text, Vec2 position, DrawOptions options = DrawOptions()) {
|
void drawText(Font font, IStr text, Vec2 position, DrawOptions options = DrawOptions()) {
|
||||||
static linesBuffer = FixedList!(IStr, 256)();
|
static FixedList!(IStr, 128) linesBuffer = void;
|
||||||
static linesWidthBuffer = FixedList!(int, 256)();
|
static FixedList!(short, 128) linesWidthBuffer = void;
|
||||||
|
|
||||||
if (font.isEmpty || text.length == 0) return;
|
if (font.isEmpty || text.length == 0) return;
|
||||||
linesBuffer.clear();
|
linesBuffer.clear();
|
||||||
|
@ -2309,10 +2305,10 @@ void drawText(Font font, IStr text, Vec2 position, DrawOptions options = DrawOpt
|
||||||
auto codepoint = rl.GetCodepointNext(&text[textCodepointIndex], &codepointSize);
|
auto codepoint = rl.GetCodepointNext(&text[textCodepointIndex], &codepointSize);
|
||||||
if (codepoint == '\n' || textCodepointIndex == text.length - codepointSize) {
|
if (codepoint == '\n' || textCodepointIndex == text.length - codepointSize) {
|
||||||
linesBuffer.append(text[lineCodepointIndex .. textCodepointIndex + (codepoint != '\n')]);
|
linesBuffer.append(text[lineCodepointIndex .. textCodepointIndex + (codepoint != '\n')]);
|
||||||
linesWidthBuffer.append(cast(int) (measureTextSize(font, linesBuffer[$ - 1]).x));
|
linesWidthBuffer.append(cast(ushort) (measureTextSize(font, linesBuffer[$ - 1]).x));
|
||||||
if (textMaxLineWidth < linesWidthBuffer[$ - 1]) textMaxLineWidth = linesWidthBuffer[$ - 1];
|
if (textMaxLineWidth < linesWidthBuffer[$ - 1]) textMaxLineWidth = linesWidthBuffer[$ - 1];
|
||||||
if (codepoint == '\n') textHeight += font.lineSpacing;
|
if (codepoint == '\n') textHeight += font.lineSpacing;
|
||||||
lineCodepointIndex = cast(int) (textCodepointIndex + 1);
|
lineCodepointIndex = cast(ushort) (textCodepointIndex + 1);
|
||||||
}
|
}
|
||||||
textCodepointIndex += codepointSize;
|
textCodepointIndex += codepointSize;
|
||||||
}
|
}
|
||||||
|
@ -2423,7 +2419,14 @@ mixin template runGame(alias readyFunc, alias updateFunc, alias finishFunc, int
|
||||||
extern(C)
|
extern(C)
|
||||||
void main(int argc, immutable(char)** argv) {
|
void main(int argc, immutable(char)** argv) {
|
||||||
openWindow(width, height, [], title);
|
openWindow(width, height, [], title);
|
||||||
foreach (i; 0 .. argc) engineState.envArgsBuffer.append(argv[i].toStr());
|
// Yeah... I love writing code again and again and again.
|
||||||
|
foreach (i; 0 .. argc) {
|
||||||
|
Sz length = 0;
|
||||||
|
while (argv[i][length] != '\0') {
|
||||||
|
length += 1;
|
||||||
|
}
|
||||||
|
engineState.envArgsBuffer.append(argv[i][0 .. length]);
|
||||||
|
}
|
||||||
readyFunc();
|
readyFunc();
|
||||||
updateWindow(&updateFunc);
|
updateWindow(&updateFunc);
|
||||||
finishFunc();
|
finishFunc();
|
||||||
|
|
|
@ -146,6 +146,30 @@ struct BoxWorld {
|
||||||
|
|
||||||
@safe @nogc nothrow:
|
@safe @nogc nothrow:
|
||||||
|
|
||||||
|
@trusted
|
||||||
|
void appendWallIdToSpatialGrid(WallBoxId id) {
|
||||||
|
FixedList!(IVec2, 4) vecSet = void;
|
||||||
|
// vecSet.clear();
|
||||||
|
// auto taggedId = id & ~(1 << 31);
|
||||||
|
// foreach (position; getWallSpatialGridPositions) {
|
||||||
|
// auto canAppend = true;
|
||||||
|
// foreach (vec; vecSet) {
|
||||||
|
// if (vec == position) {
|
||||||
|
// canAppend = false;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (canAppend) {
|
||||||
|
// grid[vec.y, vec.x].append(taggedId);
|
||||||
|
// vecSet.append(vec);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeWallIdFromSpatialGrid(WallBoxId id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void enableSpatialGrid(Sz rowCount, Sz colCount, int tileWidth, int tileHeight) {
|
void enableSpatialGrid(Sz rowCount, Sz colCount, int tileWidth, int tileHeight) {
|
||||||
gridTileWidth = tileWidth;
|
gridTileWidth = tileWidth;
|
||||||
gridTileHeight = tileHeight;
|
gridTileHeight = tileHeight;
|
||||||
|
@ -156,20 +180,20 @@ struct BoxWorld {
|
||||||
foreach (i, ref properties; wallsProperties) {
|
foreach (i, ref properties; wallsProperties) {
|
||||||
auto id = cast(BaseBoxId) (i + 1);
|
auto id = cast(BaseBoxId) (i + 1);
|
||||||
auto tagged = id & ~(1 << 31);
|
auto tagged = id & ~(1 << 31);
|
||||||
auto positions = getWallGridPositions(id);
|
auto positions = getWallSpatialGridPositions(id);
|
||||||
grid[positions[0].y, positions[0].x].append(tagged);
|
// grid[positions[0].y, positions[0].x].append(tagged);
|
||||||
if (positions[0] != positions[1]) {
|
// if (positions[0] != positions[1]) {
|
||||||
grid[positions[1].y, positions[1].x].append(tagged);
|
// grid[positions[1].y, positions[1].x].append(tagged);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
foreach (i, ref properties; actorsProperties) {
|
foreach (i, ref properties; actorsProperties) {
|
||||||
auto id = cast(BaseBoxId) (i + 1);
|
auto id = cast(BaseBoxId) (i + 1);
|
||||||
auto tagged = id | (1 << 31);
|
auto tagged = id | (1 << 31);
|
||||||
auto positions = getWallGridPositions(id);
|
auto positions = getActorSpatialGridPositions(id);
|
||||||
grid[positions[0].y, positions[0].x].append(tagged);
|
// grid[positions[0].y, positions[0].x].append(tagged);
|
||||||
if (positions[0] != positions[1]) {
|
// if (positions[0] != positions[1]) {
|
||||||
grid[positions[1].y, positions[1].x].append(tagged);
|
// grid[positions[1].y, positions[1].x].append(tagged);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,13 +222,17 @@ struct BoxWorld {
|
||||||
}
|
}
|
||||||
|
|
||||||
@trusted
|
@trusted
|
||||||
IVec2[2] getWallGridPositions(WallBoxId id) {
|
IVec2[4] getWallSpatialGridPositions(WallBoxId id) {
|
||||||
IVec2[2] result = void;
|
IVec2[4] result = void;
|
||||||
auto i = id - 1;
|
auto i = id - 1;
|
||||||
result[0].x = walls[i].position.x / gridTileWidth - (walls[i].position.x < 0);
|
result[0].x = walls[i].position.x / gridTileWidth - (walls[i].position.x < 0);
|
||||||
result[0].y = walls[i].position.y / gridTileHeight - (walls[i].position.y < 0);
|
result[0].y = walls[i].position.y / gridTileHeight - (walls[i].position.y < 0);
|
||||||
result[1].x = (walls[i].position.x + walls[i].size.x) - ((walls[i].position.x + walls[i].size.x) < 0);
|
result[3].x = (walls[i].position.x + walls[i].size.x) - ((walls[i].position.x + walls[i].size.x) < 0);
|
||||||
result[1].y = (walls[i].position.y + walls[i].size.y) - ((walls[i].position.y + walls[i].size.y) < 0);
|
result[3].y = (walls[i].position.y + walls[i].size.y) - ((walls[i].position.y + walls[i].size.y) < 0);
|
||||||
|
result[1].x = result[3].x;
|
||||||
|
result[1].y = result[0].y;
|
||||||
|
result[2].x = result[0].x;
|
||||||
|
result[2].y = result[3].y;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,13 +255,17 @@ struct BoxWorld {
|
||||||
}
|
}
|
||||||
|
|
||||||
@trusted
|
@trusted
|
||||||
IVec2[2] getActorGridPositions(WallBoxId id) {
|
IVec2[4] getActorSpatialGridPositions(WallBoxId id) {
|
||||||
IVec2[2] result = void;
|
IVec2[4] result = void;
|
||||||
auto i = id - 1;
|
auto i = id - 1;
|
||||||
result[0].x = actors[i].position.x / gridTileWidth - (actors[i].position.x < 0);
|
result[0].x = actors[i].position.x / gridTileWidth - (actors[i].position.x < 0);
|
||||||
result[0].y = actors[i].position.y / gridTileHeight - (actors[i].position.y < 0);
|
result[0].y = actors[i].position.y / gridTileHeight - (actors[i].position.y < 0);
|
||||||
result[1].x = (actors[i].position.x + actors[i].size.x) - ((actors[i].position.x + actors[i].size.x) < 0);
|
result[1].x = (actors[i].position.x + actors[i].size.x) - ((actors[i].position.x + actors[i].size.x) < 0);
|
||||||
result[1].y = (actors[i].position.y + actors[i].size.y) - ((actors[i].position.y + actors[i].size.y) < 0);
|
result[1].y = (actors[i].position.y + actors[i].size.y) - ((actors[i].position.y + actors[i].size.y) < 0);
|
||||||
|
result[1].x = result[3].x;
|
||||||
|
result[1].y = result[0].y;
|
||||||
|
result[2].x = result[0].x;
|
||||||
|
result[2].y = result[3].y;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -845,7 +845,6 @@ enum
|
||||||
|
|
||||||
// Callbacks to hook some internal functions
|
// Callbacks to hook some internal functions
|
||||||
// WARNING: These callbacks are intended for advance users
|
// WARNING: These callbacks are intended for advance users
|
||||||
// alias TraceLogCallback = void function (int logLevel, const(char)* text, va_list args); // Logging: Redirect trace log messages
|
|
||||||
alias LoadFileDataCallback = ubyte* function (const(char)* fileName, int* dataSize); // FileIO: Load binary data
|
alias LoadFileDataCallback = ubyte* function (const(char)* fileName, int* dataSize); // FileIO: Load binary data
|
||||||
alias SaveFileDataCallback = bool function (const(char)* fileName, void* data, int dataSize); // FileIO: Save binary data
|
alias SaveFileDataCallback = bool function (const(char)* fileName, void* data, int dataSize); // FileIO: Save binary data
|
||||||
alias LoadFileTextCallback = char* function (const(char)* fileName); // FileIO: Load text data
|
alias LoadFileTextCallback = char* function (const(char)* fileName); // FileIO: Load text data
|
||||||
|
@ -999,7 +998,6 @@ void MemFree (void* ptr); // Internal memory free
|
||||||
|
|
||||||
// Set custom callbacks
|
// Set custom callbacks
|
||||||
// WARNING: Callbacks setup is intended for advance users
|
// WARNING: Callbacks setup is intended for advance users
|
||||||
// void SetTraceLogCallback (TraceLogCallback callback); // Set custom trace log
|
|
||||||
void SetLoadFileDataCallback (LoadFileDataCallback callback); // Set custom file binary data loader
|
void SetLoadFileDataCallback (LoadFileDataCallback callback); // Set custom file binary data loader
|
||||||
void SetSaveFileDataCallback (SaveFileDataCallback callback); // Set custom file binary data saver
|
void SetSaveFileDataCallback (SaveFileDataCallback callback); // Set custom file binary data saver
|
||||||
void SetLoadFileTextCallback (LoadFileTextCallback callback); // Set custom file text data loader
|
void SetLoadFileTextCallback (LoadFileTextCallback callback); // Set custom file text data loader
|
||||||
|
@ -1035,7 +1033,6 @@ void UnloadDirectoryFiles (FilePathList files); // Unload filepaths
|
||||||
bool IsFileDropped (); // Check if a file has been dropped into window
|
bool IsFileDropped (); // Check if a file has been dropped into window
|
||||||
FilePathList LoadDroppedFiles (); // Load dropped filepaths
|
FilePathList LoadDroppedFiles (); // Load dropped filepaths
|
||||||
void UnloadDroppedFiles (FilePathList files); // Unload dropped filepaths
|
void UnloadDroppedFiles (FilePathList files); // Unload dropped filepaths
|
||||||
// c_long GetFileModTime (const(char)* fileName); // Get file modification time (last write time)
|
|
||||||
|
|
||||||
// Compression/Encoding functionality
|
// Compression/Encoding functionality
|
||||||
ubyte* CompressData (const(ubyte)* data, int dataSize, int* compDataSize); // Compress data (DEFLATE algorithm), memory must be MemFree()
|
ubyte* CompressData (const(ubyte)* data, int dataSize, int* compDataSize); // Compress data (DEFLATE algorithm), memory must be MemFree()
|
||||||
|
|
|
@ -199,11 +199,11 @@ bool isUiClicked() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isUiItemDragged() {
|
bool isUiItemDragged() {
|
||||||
return uiState.itemId == uiState.draggedItemId && deltaMouse;
|
return uiState.itemId == uiState.draggedItemId && !deltaMouse.isZero;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isUiDragged() {
|
bool isUiDragged() {
|
||||||
return uiState.draggedItemId > 0 && deltaMouse;
|
return uiState.draggedItemId > 0 && !deltaMouse.isZero;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 uiDragOffset() {
|
Vec2 uiDragOffset() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue