gryphn+vulkan command buffers

This commit is contained in:
Greg Wells
2025-05-30 08:19:22 -04:00
parent 706b558684
commit f5ff90bc93
19 changed files with 254 additions and 37 deletions

View File

@@ -15,4 +15,5 @@
#include <core/textures/gryphn_texture.h> #include <core/textures/gryphn_texture.h>
#include <core/command/command_pool/gryphn_command_pool.h> #include <core/command/command_pool/gryphn_command_pool.h>
#include <core/command/command_buffer/gryphn_command_buffer.h> #include <core/command/command_buffer/gryphn_command_buffer.h>
#include <core/command/commands/gryphn_command.h>
#include <core/renderpass/gryphn_render_pass.h> #include <core/renderpass/gryphn_render_pass.h>

View File

@@ -0,0 +1,41 @@
#include "vulkan_command_buffer.h"
#include "commands/command_pool/vulkan_command_pool.h"
#include "output_device/vulkan_output_devices.h"
gnReturnCode gnCommandPoolAllocateCommandBuffersFn(struct gnCommandBuffer_t* commandBuffers, uint32_t count, struct gnCommandPool_t* pool) {
VkCommandBufferAllocateInfo allocInfo = {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = pool->commandPool->commandPool,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = count,
};
VkCommandBuffer* buffers = malloc(sizeof(VkCommandBuffer) * count);
if (vkAllocateCommandBuffers(pool->device->outputDevice->device, &allocInfo, buffers) != VK_SUCCESS)
return GN_FAILED_TO_ALLOCATE_COMMAND_BUFFERS;
for (int i = 0; i < count; i++) {
commandBuffers[i].commandBuffer = malloc(sizeof(gnPlatformCommandBuffer));
commandBuffers[i].commandBuffer->buffer = buffers[i];
}
return GN_SUCCESS;
}
gnReturnCode gnBeginCommandBufferFn(struct gnCommandBuffer_t* commandBuffer) {
VkCommandBufferBeginInfo beginInfo = {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO
};
if (vkBeginCommandBuffer(commandBuffer->commandBuffer->buffer, &beginInfo) != VK_SUCCESS) {
return GN_FAILED_TO_BEGIN_RECORDING;
}
return GN_SUCCESS;
}
gnReturnCode gnEndCommandBufferFn(struct gnCommandBuffer_t* commandBuffer) {
if (vkEndCommandBuffer(commandBuffer->commandBuffer->buffer) != VK_SUCCESS)
return GN_FAIELD_TO_END_RECORDING;
return GN_SUCCESS;
}

View File

@@ -0,0 +1,7 @@
#pragma once
#include "core/command/command_buffer/gryphn_command_buffer.h"
#include <vulkan/vulkan.h>
typedef struct gnPlatformCommandBuffer_t {
VkCommandBuffer buffer;
} gnPlatformCommandBuffer;

View File

@@ -0,0 +1,59 @@
#include <vulkan/vulkan.h>
#include "core/command/commands/gryphn_command.h"
#include <renderpass/vulkan_render_pass_descriptor.h>
#include "framebuffers/vulkan_framebuffer.h"
#include "commands/command_buffer/vulkan_command_buffer.h"
#include "pipelines/graphics_pipeline/vulkan_graphics_pipeline.h"
void gnCommandBeginRenderPassFn(struct gnCommandBuffer_t* buffer, struct gnRenderPassInfo_t passInfo) {
VkClearValue* values = malloc(sizeof(VkClearValue) * passInfo.clearValueCount);
for (int i = 0; i < passInfo.clearValueCount; i++) {
values[i] = (VkClearValue){{{
passInfo.clearValues[i].red,
passInfo.clearValues[i].green,
passInfo.clearValues[i].blue,
passInfo.clearValues[i].alpha
}}};
}
VkRenderPassBeginInfo renderPassInfo ={
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
.renderPass = passInfo.renderPassDescriptor->renderPassDescriptor->renderPass,
.framebuffer = passInfo.framebuffer->framebuffer->framebuffer,
.renderArea = {
.extent = { passInfo.size.x, passInfo.size.y },
.offset = { passInfo.offset.x, passInfo.offset.x }
},
.clearValueCount = passInfo.clearValueCount,
.pClearValues = values
};
vkCmdBeginRenderPass(buffer->commandBuffer->buffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
}
void gnCommandEndRenderPassFn(struct gnCommandBuffer_t* buffer) {
vkCmdEndRenderPass(buffer->commandBuffer->buffer);
}
void gnCommandBindGraphicsPipelineFn(struct gnCommandBuffer_t* buffer, struct gnGraphicsPipeline_t* graphicsPipeline) {
vkCmdBindPipeline(buffer->commandBuffer->buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline->graphicsPipeline->graphicsPipeline);
}
void gnCommandSetViewportFn(struct gnCommandBuffer_t* buffer, struct gnViewport_t viewport) {
VkViewport vkViewport = {
.x = viewport.position.x,
.y = viewport.position.y,
.width = viewport.size.x,
.height = viewport.size.y,
.minDepth = viewport.minDepth,
.maxDepth = viewport.maxDepth
};
vkCmdSetViewport(buffer->commandBuffer->buffer, 0, 1, &vkViewport);
}
void gnCommandSetScissorFn(struct gnCommandBuffer_t* buffer, struct gnScissor_t scissor) {
VkRect2D vkScissor = {
.extent = { scissor.size.x, scissor.size.y },
.offset = { scissor.position.x, scissor.position.y }
};
vkCmdSetScissor(buffer->commandBuffer->buffer, 0, 1, &vkScissor);
}
void gnCommandDrawFn(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
vkCmdDraw(buffer->commandBuffer->buffer, vertexCount, instanceCount, firstVertex, firstInstance);
}

View File

@@ -0,0 +1,18 @@
#include "gryphn_command_buffer.h"
#include "core/gryphn_platform_functions.h"
#include "stdio.h"
gnReturnCode gnCommandPoolAllocateCommandBuffers(struct gnCommandBuffer_t* buffers, uint32_t count, struct gnCommandPool_t* commandPool) {
for (int i = 0; i < count; i++) {
buffers[i].commandPool = commandPool;
}
return commandPool->commandFunctions->_gnCommandPoolAllocateCommandBuffers(buffers, count, commandPool);
}
gnReturnCode gnBeginCommandBuffer(struct gnCommandBuffer_t* commandBuffer) {
return commandBuffer->commandPool->commandFunctions->_gnBeginCommandBuffer(commandBuffer);
}
gnReturnCode gnEndCommandBuffer(struct gnCommandBuffer_t* commandBuffer) {
return commandBuffer->commandPool->commandFunctions->_gnEndCommandBuffer(commandBuffer);
}

View File

@@ -1,10 +1,12 @@
#pragma once #pragma once
#include <core/command/command_pool/gryphn_command_pool.h> #include <core/command/command_pool/gryphn_command_pool.h>
#include "core/renderpass/gryphn_render_pass.h"
typedef struct gnCommandBuffer_t { typedef struct gnCommandBuffer_t {
struct gnPlatformCommandBuffer_t* commandBuffer; struct gnPlatformCommandBuffer_t* commandBuffer;
struct gnCommandPool_t* commandPool;
} gnCommandBuffer; } gnCommandBuffer;
gnReturnCode gnCommandPoolAllocateCommandBuffers(struct gnCommandBuffer_t* buffers, uint32_t count, struct gnCommandPool_t* commandPool);
gnReturnCode gnBeginCommandBuffer(struct gnCommandBuffer_t* commandBuffer); gnReturnCode gnBeginCommandBuffer(struct gnCommandBuffer_t* commandBuffer);
void gnCommandBufferBeginRenderPass(struct gnRenderPassInfo_t passInfo); gnReturnCode gnEndCommandBuffer(struct gnCommandBuffer_t* commandBuffer);

View File

@@ -1,7 +1,15 @@
#include "gryphn_command_pool.h" #include "gryphn_command_pool.h"
#include "core/gryphn_platform_functions.h" #include "core/gryphn_platform_functions.h"
#include "core/instance/init/gryphn_init.h"
gnReturnCode gnCreateCommandPool(struct gnCommandPool_t* commandPool, struct gnOutputDevice_t* device, struct gnCommandPoolInfo_t info) { gnReturnCode gnCreateCommandPool(struct gnCommandPool_t* commandPool, struct gnOutputDevice_t* device, struct gnCommandPoolInfo_t info) {
if (!device->instance->loadCommandFunctions) {
device->instance->commandFunctions = malloc(sizeof(struct gnCommandFunctions_t));
gnLoadCommandFunctions(device->instance->dynamicLib, device->instance->commandFunctions);
device->instance->loadCommandFunctions = gnTrue;
}
commandPool->commandFunctions = device->instance->commandFunctions;
commandPool->device = device; commandPool->device = device;
return device->deviceFunctions->_gnCreateCommandPool(commandPool, device, info); return device->deviceFunctions->_gnCreateCommandPool(commandPool, device, info);
} }

View File

@@ -8,6 +8,7 @@ typedef struct gnCommandPoolInfo_t {
typedef struct gnCommandPool_t { typedef struct gnCommandPool_t {
struct gnPlatformCommandPool_t* commandPool; struct gnPlatformCommandPool_t* commandPool;
struct gnCommandFunctions_t* commandFunctions;
struct gnOutputDevice_t* device; struct gnOutputDevice_t* device;
} gnCommandPool; } gnCommandPool;

View File

@@ -0,0 +1,23 @@
#include "gryphn_command.h"
#include "core/gryphn_platform_functions.h"
void gnCommandBeginRenderPass(struct gnCommandBuffer_t* buffer, struct gnRenderPassInfo_t passInfo) {
buffer->commandPool->commandFunctions->_gnCommandBeginRenderPass(buffer, passInfo);
}
void gnCommandEndRenderPass(struct gnCommandBuffer_t* buffer) {
buffer->commandPool->commandFunctions->_gnCommandEndRenderPass(buffer);
}
void gnCommandBindGraphicsPipeline(struct gnCommandBuffer_t* buffer, struct gnGraphicsPipeline_t* graphicsPipeline) {
buffer->commandPool->commandFunctions->_gnCommandBindGraphicsPipeline(buffer, graphicsPipeline);
}
void gnCommandSetViewport(struct gnCommandBuffer_t* buffer, struct gnViewport_t viewport) {
buffer->commandPool->commandFunctions->_gnCommandSetViewport(buffer, viewport);
}
void gnCommandSetScissor(struct gnCommandBuffer_t* buffer, struct gnScissor_t scissor) {
buffer->commandPool->commandFunctions->_gnCommandSetScissor(buffer, scissor);
}
void gnCommandDraw(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
buffer->commandPool->commandFunctions->_gnCommandDraw(buffer, vertexCount, firstVertex, instanceCount, firstInstance);
}

View File

@@ -0,0 +1,13 @@
#include "core/command/command_buffer/gryphn_command_buffer.h"
#include "core/renderpass/gryphn_render_pass.h"
void gnCommandBeginRenderPass(struct gnCommandBuffer_t* buffer, struct gnRenderPassInfo_t passInfo);
void gnCommandEndRenderPass(struct gnCommandBuffer_t* buffer);
#include "core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h"
void gnCommandBindGraphicsPipeline(struct gnCommandBuffer_t* buffer, struct gnGraphicsPipeline_t* graphicsPipeline);
void gnCommandSetViewport(struct gnCommandBuffer_t* buffer, struct gnViewport_t viewport);
void gnCommandSetScissor(struct gnCommandBuffer_t* buffer, struct gnScissor_t scissor);
void gnCommandDraw(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);

View File

@@ -53,7 +53,7 @@ typedef struct gnDebugger_t {
gnReturnCode gnCreateDebugger(gnDebugger* debugger, const struct gnDebuggerInfo_t info); gnReturnCode gnCreateDebugger(gnDebugger* debugger, const struct gnDebuggerInfo_t info);
void gnDestroyDebugger(gnDebugger* debugger); void gnDestroyDebugger(gnDebugger* debugger);
void gnDebuggerSetErrorMessage(gnDebugger* debugger, gnMessageData data) { static void gnDebuggerSetErrorMessage(gnDebugger* debugger, gnMessageData data) {
debugger->info.callback( debugger->info.callback(
GN_MESSAGE_ERROR, GN_MESSAGE_ERROR,
GN_DEBUG_MESSAGE_VALIDATION, GN_DEBUG_MESSAGE_VALIDATION,

View File

@@ -13,6 +13,7 @@
#include "framebuffer/gryphn_framebuffer.h" #include "framebuffer/gryphn_framebuffer.h"
#include "command/command_pool/gryphn_command_pool.h" #include "command/command_pool/gryphn_command_pool.h"
#include "command/command_buffer/gryphn_command_buffer.h" #include "command/command_buffer/gryphn_command_buffer.h"
#include "renderpass/gryphn_render_pass.h"
typedef struct gnFunctions_t { typedef struct gnFunctions_t {
gnReturnCode (*_gnCreateInstance)(gnInstance* instance, struct gnInstanceInfo_t info); gnReturnCode (*_gnCreateInstance)(gnInstance* instance, struct gnInstanceInfo_t info);
@@ -75,4 +76,15 @@ typedef struct gnDeviceFunctions_t {
typedef struct gnCommandFunctions_t { typedef struct gnCommandFunctions_t {
gnReturnCode (*_gnCommandPoolAllocateCommandBuffers)(struct gnCommandBuffer_t* commandBuffers, uint32_t count, struct gnCommandPool_t* pool); gnReturnCode (*_gnCommandPoolAllocateCommandBuffers)(struct gnCommandBuffer_t* commandBuffers, uint32_t count, struct gnCommandPool_t* pool);
gnReturnCode (*_gnBeginCommandBuffer)(struct gnCommandBuffer_t* commandBuffer);
gnReturnCode (*_gnEndCommandBuffer)(struct gnCommandBuffer_t* commandBuffer);
void (*_gnCommandBeginRenderPass)(struct gnCommandBuffer_t* buffer, struct gnRenderPassInfo_t passInfo);
void (*_gnCommandEndRenderPass)(struct gnCommandBuffer_t* buffer);
void (*_gnCommandBindGraphicsPipeline)(struct gnCommandBuffer_t* buffer, struct gnGraphicsPipeline_t* graphicsPipeline);
void (*_gnCommandSetViewport)(struct gnCommandBuffer_t* buffer, struct gnViewport_t viewport);
void (*_gnCommandSetScissor)(struct gnCommandBuffer_t* buffer, struct gnScissor_t scissor);
void (*_gnCommandDraw)(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);
} gnCommandFunctions; } gnCommandFunctions;

View File

@@ -11,7 +11,7 @@ typedef enum gnRenderingAPI_t {
GN_RENDERINGAPI_METAL GN_RENDERINGAPI_METAL
} gnRenderingAPI; } gnRenderingAPI;
gnString gnRenderingAPIName(gnRenderingAPI api) { static gnString gnRenderingAPIName(gnRenderingAPI api) {
switch (api) { switch (api) {
case GN_RENDERINGAPI_NONE: return gnCreateString("GN_RENDERINGAPI_NONE"); case GN_RENDERINGAPI_NONE: return gnCreateString("GN_RENDERINGAPI_NONE");
case GN_RENDERINGAPI_SOFTWARE: return gnCreateString("GN_RENDERINGAPI_SOFTWARE"); case GN_RENDERINGAPI_SOFTWARE: return gnCreateString("GN_RENDERINGAPI_SOFTWARE");

View File

@@ -82,3 +82,13 @@ void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFuncti
gnLoadDLLFunction(lib, functions->_gnCreateCommandPool, "gnCreateCommandPoolFn"); gnLoadDLLFunction(lib, functions->_gnCreateCommandPool, "gnCreateCommandPoolFn");
gnLoadDLLFunction(lib, functions->_gnDestroyCommandPool, "gnDestroyCommandPoolFn"); gnLoadDLLFunction(lib, functions->_gnDestroyCommandPool, "gnDestroyCommandPoolFn");
} }
void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunctions_t* functions) {
gnLoadDLLFunction(lib, functions->_gnCommandPoolAllocateCommandBuffers, "gnCommandPoolAllocateCommandBuffersFn");
gnLoadDLLFunction(lib, functions->_gnBeginCommandBuffer, "gnBeginCommandBufferFn");
gnLoadDLLFunction(lib, functions->_gnCommandBeginRenderPass, "gnCommandBeginRenderPassFn");
gnLoadDLLFunction(lib, functions->_gnCommandEndRenderPass, "gnCommandEndRenderPassFn");
gnLoadDLLFunction(lib, functions->_gnCommandSetViewport, "gnCommandSetViewportFn");
gnLoadDLLFunction(lib, functions->_gnCommandSetScissor, "gnCommandSetScissorFn");
gnLoadDLLFunction(lib, functions->_gnCommandDraw, "gnCommandDraw");
}

View File

@@ -8,6 +8,7 @@ gnBool gnIsAPISupported(gnRenderingAPI RenderingAPI);
struct gnDynamicLibrary_t* gnLoadRenderingDLL(gnRenderingAPI RenderingAPI); struct gnDynamicLibrary_t* gnLoadRenderingDLL(gnRenderingAPI RenderingAPI);
void gnLoadFunctions(struct gnDynamicLibrary_t* lib, struct gnFunctions_t* functions); void gnLoadFunctions(struct gnDynamicLibrary_t* lib, struct gnFunctions_t* functions);
void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFunctions_t* functions); void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFunctions_t* functions);
void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunctions_t* function);
// #ifdef GN_REVEAL_IMPL // #ifdef GN_REVEAL_IMPL
// gnErrorCode gnInit(gnRenderingAPI RenderingAPI); // gnErrorCode gnInit(gnRenderingAPI RenderingAPI);

View File

@@ -1,10 +1,13 @@
#pragma once #pragma once
#include "gryphn_render_pass_descriptor.h" #include "gryphn_render_pass_descriptor.h"
#include "core/framebuffer/gryphn_framebuffer.h" #include "core/framebuffer/gryphn_framebuffer.h"
#include "utils/types/gryphn_color.h"
typedef struct gnRenderPassInfo_t { typedef struct gnRenderPassInfo_t {
struct gnRenderPassDescriptor_t* renderPassDescriptor; struct gnRenderPassDescriptor_t* renderPassDescriptor;
struct gnFramebuffer_t* framebuffer; struct gnFramebuffer_t* framebuffer;
gnUInt2 offset; gnUInt2 offset;
gnUInt2 size; gnUInt2 size;
uint32_t clearValueCount;
gnClearValue* clearValues;
} gnRenderPassInfo; } gnRenderPassInfo;

View File

@@ -27,13 +27,15 @@ typedef enum gnReturnCode_t {
GN_UNKNOWN_SUBPASS, GN_UNKNOWN_SUBPASS,
GN_FAILED_TO_CREATE_FRAMEBUFFER, GN_FAILED_TO_CREATE_FRAMEBUFFER,
GN_DIVERGENT_RENDERPASS, GN_DIVERGENT_RENDERPASS,
GN_FAILED_TO_CREATE_COMMAND_POOL GN_FAILED_TO_CREATE_COMMAND_POOL,
GN_FAILED_TO_BEGIN_RECORDING,
GN_FAIELD_TO_END_RECORDING,
GN_FAILED_TO_ALLOCATE_COMMAND_BUFFERS
} gnReturnCode; } gnReturnCode;
typedef gnReturnCode gnErrorCode; typedef gnReturnCode gnErrorCode;
const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) { static const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) {
switch (returnCode) { switch (returnCode) {
default: return "GN_FORGOT";
case GN_SUCCESS: return "GN_SUCCESS"; case GN_SUCCESS: return "GN_SUCCESS";
case GN_UNKNOWN_RENDERINGAPI: return "GN_UNKNOWN_RENDERINGAPI"; case GN_UNKNOWN_RENDERINGAPI: return "GN_UNKNOWN_RENDERINGAPI";
case GN_UNSUPPORTED_RENDERING_API: return "GN_UNSUPPORTED_RENDERING_API"; case GN_UNSUPPORTED_RENDERING_API: return "GN_UNSUPPORTED_RENDERING_API";
@@ -41,6 +43,7 @@ const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) {
case GN_FAILED_CREATE_INSTANCE: return "GN_FAILED_CREATE_INSTANCE"; case GN_FAILED_CREATE_INSTANCE: return "GN_FAILED_CREATE_INSTANCE";
case GN_FAILED_TO_CREATE_DEBUGGER: return "GN_FAILED_TO_CREATE_DEBUGGER"; case GN_FAILED_TO_CREATE_DEBUGGER: return "GN_FAILED_TO_CREATE_DEBUGGER";
case GN_FAILED_TO_CREATE_DEVICE: return "GN_FAILED_TO_CREATE_DEVICE"; case GN_FAILED_TO_CREATE_DEVICE: return "GN_FAILED_TO_CREATE_DEVICE";
case GN_FAILED_TO_ATTACH_WINDOW: return "GN_FAILED_TO_ATTACH_WINDOW";
case GN_INVALID_INSTANCE: return "GN_INVALID_INSTANCE"; case GN_INVALID_INSTANCE: return "GN_INVALID_INSTANCE";
case GN_DEBUGGER_EXISTS: return "GN_DEBUGGER_EXISTS"; case GN_DEBUGGER_EXISTS: return "GN_DEBUGGER_EXISTS";
case GN_NO_SUPPORTED_FORMATS: return "GN_NO_SUPPORTED_FORMATS"; case GN_NO_SUPPORTED_FORMATS: return "GN_NO_SUPPORTED_FORMATS";
@@ -60,5 +63,8 @@ const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) {
case GN_FAILED_TO_CREATE_FRAMEBUFFER: return "GN_FAILED_TO_CREATE_FRAMEBUFFER"; case GN_FAILED_TO_CREATE_FRAMEBUFFER: return "GN_FAILED_TO_CREATE_FRAMEBUFFER";
case GN_DIVERGENT_RENDERPASS: return "GN_DIVERGENT_RENDERPASS"; case GN_DIVERGENT_RENDERPASS: return "GN_DIVERGENT_RENDERPASS";
case GN_FAILED_TO_CREATE_COMMAND_POOL: return "GN_FAILED_TO_CREATE_COMMAND_POOL"; case GN_FAILED_TO_CREATE_COMMAND_POOL: return "GN_FAILED_TO_CREATE_COMMAND_POOL";
case GN_FAILED_TO_BEGIN_RECORDING: return "GN_FAILED_TO_BEGIN_RECORDING";
case GN_FAIELD_TO_END_RECORDING: return "GN_FAIELD_TO_END_RECORDING";
case GN_FAILED_TO_ALLOCATE_COMMAND_BUFFERS: return "GN_FAILED_TO_ALLOCATE_COMMAND_BUFFERS";
} }
} }

View File

@@ -25,7 +25,7 @@ typedef char gnChar;
typedef struct gnString { typedef struct gnString {
gnChar* value; gnChar* value;
#ifdef __cplusplus #ifdef GN_UTILS_CPP
gnString(const gnChar* input) { gnString(const gnChar* input) {
this->value = new gnChar[strlen(input) + 1]; // so like my dumbass forgot to put this earlier and some shit was broken but now it fixed this->value = new gnChar[strlen(input) + 1]; // so like my dumbass forgot to put this earlier and some shit was broken but now it fixed
// I was wondering why one specific string crashed my program, it was my fault // I was wondering why one specific string crashed my program, it was my fault
@@ -97,7 +97,7 @@ static gnString gnCreateStringFromChar(gnChar input) {
string.value[1] = '\0'; string.value[1] = '\0';
return string; return string;
} }
gnString gnCreateEmptyString(void) { static gnString gnCreateEmptyString() {
gnString string; gnString string;
string.value = (char*)malloc(sizeof(char)); string.value = (char*)malloc(sizeof(char));
string.value[0] = '\0'; string.value[0] = '\0';
@@ -110,31 +110,31 @@ gnString gnCreateEmptyString(void) {
gnChar: gnCreateStringFromChar \ gnChar: gnCreateStringFromChar \
)(input) )(input)
const char* gnToCString(const gnString string) { return string.value; } static const char* gnToCString(const gnString string) { return string.value; }
int gnStringLength(const gnString string) { return strlen(string.value); } static int gnStringLength(const gnString string) { return strlen(string.value); }
int gnStringFindChar(const gnString string, const gnChar letter) { static int gnStringFindChar(const gnString string, const gnChar letter) {
for (unsigned long i = 0; i < strlen(string.value); i++) for (int i = 0; i < strlen(string.value); i++)
if (string.value[i] == letter) if (string.value[i] == letter)
return (int)i; return i;
return -1; return -1;
} }
int gnStringFindString(const gnString string, const gnString value) { static int gnStringFindString(const gnString string, const gnString value) {
char first_char = value.value[0]; char first_char = value.value[0];
for (unsigned long i = 0; i < strlen(string.value); i++) for (int i = 0; i < strlen(string.value); i++)
if (string.value[i] == first_char) { if (string.value[i] == first_char) {
gnBool same = gnTrue; gnBool same = gnTrue;
for (unsigned long c = 1; c < strlen(value.value); c++) for (int c = 1; c < strlen(value.value); c++)
if (string.value[i + c] != value.value[c]) { if (string.value[i + c] != value.value[c]) {
same = gnFalse; same = gnFalse;
break; break;
} }
if (same) if (same)
return (int)i; return i;
} }
return -1; return -1;
} }
gnString gnSubstring(const gnString string, int index1, int index2) { static gnString gnSubstring(const gnString string, int index1, int index2) {
if (index2 == -1) index2 = gnStringLength(string); if (index2 == -1) index2 = gnStringLength(string);
char* out_value = (char*)malloc(sizeof(char) * ((index2 - index1) + 1)); char* out_value = (char*)malloc(sizeof(char) * ((index2 - index1) + 1));
for (int i = 0; i < (index2 - index1); i++) for (int i = 0; i < (index2 - index1); i++)
@@ -143,7 +143,7 @@ gnString gnSubstring(const gnString string, int index1, int index2) {
return gnCreateString(out_value); // zero error checking on this function should really add that in later but like I dont have a logging library that I want to use return gnCreateString(out_value); // zero error checking on this function should really add that in later but like I dont have a logging library that I want to use
// my code never breaks either so I dont need error checks, il just not make errors cuz im not tim // my code never breaks either so I dont need error checks, il just not make errors cuz im not tim
} }
int gnLetterCount(const gnString string, const gnChar letter) { static int gnLetterCount(const gnString string, const gnChar letter) {
int count = 0; int count = 0;
for (int i = 0; i < gnStringLength(string); i++) if (string.value[i] == letter) count++; for (int i = 0; i < gnStringLength(string); i++) if (string.value[i] == letter) count++;
return count; return count;
@@ -154,16 +154,16 @@ int gnLetterCount(const gnString string, const gnChar letter) {
const gnString: gnStringFindValue \ const gnString: gnStringFindValue \
)(string, value) )(string, value)
void gnAddCharToString(gnString* string, gnChar val) { static void gnAddCharToString(gnString* string, gnChar val) {
string->value = add_char_to_string(string->value, val); string->value = add_char_to_string(string->value, val);
} }
void gnAddCharPtrToString(gnString* string, gnChar* val) { static void gnAddCharPtrToString(gnString* string, gnChar* val) {
string->value = add_string_to_string(string->value, val); string->value = add_string_to_string(string->value, val);
} }
void gnAddConstCharPtrToString(gnString* string, const gnChar* val) { static void gnAddConstCharPtrToString(gnString* string, const gnChar* val) {
string->value = add_string_to_string(string->value, (gnChar*)val); string->value = add_string_to_string(string->value, (gnChar*)val);
} }
void gnAddContGnStringToString(gnString* string, gnString val) { static void gnAddContGnStringToString(gnString* string, gnString val) {
string->value = add_string_to_string(string->value, val.value); string->value = add_string_to_string(string->value, val.value);
} }
@@ -175,16 +175,16 @@ void gnAddContGnStringToString(gnString* string, gnString val) {
gnString: gnAddContGnStringToString \ gnString: gnAddContGnStringToString \
)(string, value) )(string, value)
gnString gnCombineStringsChar(const gnString string, gnChar val) { static gnString gnCombineStringsChar(const gnString string, gnChar val) {
return gnCreateString(add_char_to_string(string.value, val)); return gnCreateString(add_char_to_string(string.value, val));
} }
gnString gnCombineStringsCharPtr(const gnString string, gnChar* val) { static gnString gnCombineStringsCharPtr(const gnString string, gnChar* val) {
return gnCreateString(add_string_to_string(string.value, val)); return gnCreateString(add_string_to_string(string.value, val));
} }
gnString gnCombineStringsConstCharPtr(const gnString string, const gnChar* val) { static gnString gnCombineStringsConstCharPtr(const gnString string, const gnChar* val) {
return gnCreateString(add_string_to_string(string.value, (gnChar*)val)); return gnCreateString(add_string_to_string(string.value, (gnChar*)val));
} }
gnString gnCombineStringsString(const gnString string, const gnString val) { static gnString gnCombineStringsString(const gnString string, const gnString val) {
return gnCreateString(add_string_to_string(string.value, val.value)); return gnCreateString(add_string_to_string(string.value, val.value));
} }
@@ -196,9 +196,9 @@ gnString gnCombineStringsString(const gnString string, const gnString val) {
gnString: gnCombineStringsString \ gnString: gnCombineStringsString \
)(string, value) )(string, value)
gnBool gnStringEqualsCharPtr(const gnString string, gnChar* val) { return (strcmp(string.value, val) == 0); } static gnBool gnStringEqualsCharPtr(const gnString string, gnChar* val) { return (strcmp(string.value, val) == 0); }
gnBool gnStringEqualsConstCharPtr(const gnString string,const gnChar* val) { return (strcmp(string.value, (gnChar*)val) == 0); } static gnBool gnStringEqualsConstCharPtr(const gnString string,const gnChar* val) { return (strcmp(string.value, (gnChar*)val) == 0); }
gnBool gnStringEqualsString(const gnString string, const gnString val) { return (strcmp(string.value, val.value) == 0); } static gnBool gnStringEqualsString(const gnString string, const gnString val) { return (strcmp(string.value, val.value) == 0); }
#define gnStringEquals(string, value) _Generic((value), \ #define gnStringEquals(string, value) _Generic((value), \
gnChar*: gnStringEqualsCharPtr, \ gnChar*: gnStringEqualsCharPtr, \
@@ -206,25 +206,25 @@ gnBool gnStringEqualsString(const gnString string, const gnString val) { return
gnString: gnStringEqualsString \ gnString: gnStringEqualsString \
)(string, value) )(string, value)
gnChar gnGetCharAt(const gnString string, int index) { return string.value[index]; } static gnChar gnGetCharAt(const gnString string, int index) { return string.value[0]; }
void gnSetCharAt(gnString* string, int index, gnChar letter) { string->value[index] = letter; } static void gnSetCharAt(gnString* string, int index, gnChar letter) { string->value[0] = letter; }
void gnSetStringToChar(gnString* string, gnChar input) { static void gnSetStringToChar(gnString* string, gnChar input) {
string->value = (gnChar*)malloc(sizeof(gnChar) * 2); string->value = (gnChar*)malloc(sizeof(gnChar) * 2);
string->value[0] = input; string->value[0] = input;
string->value[1] = '\0'; string->value[1] = '\0';
} }
void gnSetStringToCharPtr(gnString* string, gnChar* input) { static void gnSetStringToCharPtr(gnString* string, gnChar* input) {
string->value = (gnChar*)malloc(sizeof(gnChar) * (strlen(input) + 1)); string->value = (gnChar*)malloc(sizeof(gnChar) * (strlen(input) + 1));
strcpy(string->value, input); strcpy(string->value, input);
string->value[strlen(input)] = '\0'; string->value[strlen(input)] = '\0';
} }
void gnSetStringToConstCharPtr(gnString* string, const gnChar* input) { static void gnSetStringToConstCharPtr(gnString* string, const gnChar* input) {
string->value = (gnChar*)malloc(sizeof(gnChar) * (strlen(input) + 1)); string->value = (gnChar*)malloc(sizeof(gnChar) * (strlen(input) + 1));
strcpy(string->value, input); strcpy(string->value, input);
string->value[strlen(input)] = '\0'; string->value[strlen(input)] = '\0';
} }
void gnSetStringToString(gnString* string, const gnString input) { static void gnSetStringToString(gnString* string, const gnString input) {
string->value = (gnChar*)malloc(sizeof(gnChar) * (strlen(input.value) + 1)); string->value = (gnChar*)malloc(sizeof(gnChar) * (strlen(input.value) + 1));
strcpy(string->value, input.value); strcpy(string->value, input.value);
string->value[strlen(input.value)] = '\0'; string->value[strlen(input.value)] = '\0';

View File

@@ -1,3 +1,15 @@
typedef struct gnClearValue {
union {
struct {
float r, g, b, a;
};
struct {
float red, green, blue, alpha;
};
};
} gnClearValue;
#pragma once #pragma once
typedef struct gnColor { typedef struct gnColor {
union { union {