ABI refactor because game maker is silly

main
cosmonaut 2021-10-05 17:57:25 -07:00
parent 85de1d89c2
commit d9e69c8f05
3 changed files with 68 additions and 53 deletions

View File

@ -118,6 +118,8 @@ static Snowstorm_Matrix3x2 Matrix3x2_CreateRotation(float radians)
float c, s;
float epsilon = 0.001f * PI / 180; /* 0.1 % of a degree */
radians = fmodf(radians, PI * 2);
if (radians > -epsilon && radians < epsilon)
{
/* Exact case for zero rotation. */
@ -217,6 +219,8 @@ typedef struct Snowstorm_Context
Snowstorm_Vector2 wind;
float particleSize;
float leftBound;
float topBound;
float rightBound;
@ -256,19 +260,29 @@ static inline float RandomRange(float min, float max)
return Random(max - min) + min;
}
/* i wanted to use pointers but game maker mangles string to pointer casts. oh well */
static Snowstorm_Context *contexts = NULL;
static uint32_t contextCount = 0;
void Snowstorm_Init()
{
srand((unsigned int)time(NULL));
}
const char* Snowstorm_Create()
/* FIXME: we should reuse IDs when contexts are destroyed */
double Snowstorm_Create(double particleSize, double leftBound, double topBound, double rightBound, double bottomBound)
{
Snowstorm_Context *context = malloc(sizeof(Snowstorm_Context));
contexts = realloc(contexts, sizeof(Snowstorm_Context) * (contextCount + 1));
contextCount += 1;
Snowstorm_Context* context = &contexts[contextCount - 1];
context->particleCapacity = 128;
context->particles = malloc(sizeof(Snowstorm_Particle) * context->particleCapacity);
context->particleCount = 0;
context->particleSize = particleSize;
context->leftBound = -10;
context->rightBound = 490;
context->topBound = -10;
@ -282,37 +296,37 @@ const char* Snowstorm_Create()
context->currentBufferAddress = NULL;
return (const char*)context;
return (double)(contextCount - 1);
}
void Snowstorm_SetUVCount(const char *contextPointer, double count)
void Snowstorm_SetUVCount(double contextId, double count)
{
Snowstorm_Context *context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
context->uvCount = (uint32_t)count;
context->uvs = realloc(context->uvs, sizeof(Snowstorm_UV) * context->uvCount);
}
void Snowstorm_SetLeftTopUV(const char *contextPointer, double index, double left, double top)
void Snowstorm_SetLeftTopUV(double contextId, double index, double left, double top)
{
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
context->uvs[(uint32_t)index].left = left;
context->uvs[(uint32_t)index].top = top;
}
void Snowstorm_SetRightBottomUV(const char* contextPointer, double index, double right, double bottom)
void Snowstorm_SetRightBottomUV(double contextId, double index, double right, double bottom)
{
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
context->uvs[(uint32_t)index].right = right;
context->uvs[(uint32_t)index].bottom = bottom;
}
void Snowstorm_Update(const char *contextPointer)
void Snowstorm_Update(double contextId)
{
uint32_t i;
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
for (i = 0; i < context->particleCount; i += 1)
{
@ -321,7 +335,7 @@ void Snowstorm_Update(const char *contextPointer)
particle->time += particle->timeRate;
float speed = Vector2_Magnitude(particle->velocity);
float rotation = sinf(particle->time / (speed * 100)) * particle->directionVariance;
float rotation = sinf(particle->time / (speed * 100)) * particle->directionVariance * (PI / 180.0f); // degrees to radians
float windSpeed = Vector2_Magnitude(context->wind);
Snowstorm_Vector2 wind = Vector2_Normalize(context->wind);
@ -342,10 +356,10 @@ void Snowstorm_Update(const char *contextPointer)
}
}
void Snowstorm_ApplyChaos(const char* contextPointer, double directionChaos, double speedChaos)
void Snowstorm_ApplyChaos(double contextId, double directionChaos, double speedChaos)
{
uint32_t i;
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
for (i = 0; i < context->particleCount; i += 1)
{
@ -356,17 +370,17 @@ void Snowstorm_ApplyChaos(const char* contextPointer, double directionChaos, dou
}
}
void Snowstorm_ApplyWind(const char *contextPointer, double xSpeed, double ySpeed)
void Snowstorm_ApplyWind(double contextId, double xSpeed, double ySpeed)
{
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
context->wind.x = (float)xSpeed;
context->wind.y = (float)ySpeed;
}
void Snowstorm_SetParticles(const char *contextPointer, double count)
void Snowstorm_SetParticles(double contextId, double count)
{
uint32_t i;
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
if (count > context->particleCapacity)
{
@ -395,30 +409,32 @@ void Snowstorm_SetParticles(const char *contextPointer, double count)
particle->rotation = 0;
particle->uvIndex = rand() % context->uvCount;
}
context->particleCount = count;
}
void Snowstorm_SetBufferAddress(const char *contextPointer, const char* bufferAddress)
void Snowstorm_SetBufferAddress(double contextId, const char* bufferAddress)
{
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
context->currentBufferAddress = (uint8_t*)bufferAddress;
}
double Snowstorm_RequiredSnowBufferSize(const char *contextPointer)
double Snowstorm_RequiredSnowBufferSize(double contextId)
{
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
return (double)context->particleCount * 6 * (sizeof(Snowstorm_Vector2) + sizeof(Snowstorm_Color) + (2 * sizeof(float)));
}
double Snowstorm_FillSnowBuffer(const char *contextPointer)
double Snowstorm_FillSnowBuffer(double contextId, double red, double green, double blue)
{
uint32_t i, vertexCount;
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
uint8_t* bufferAddress = context->currentBufferAddress;
Snowstorm_Color color;
color.r = 255;
color.g = 255;
color.b = 255;
color.r = (uint8_t)red;
color.g = (uint8_t)green;
color.b = (uint8_t)blue;
color.a = 255;
vertexCount = 0;
@ -432,21 +448,21 @@ double Snowstorm_FillSnowBuffer(const char *contextPointer)
Snowstorm_Vector2 leftBottom;
Snowstorm_Vector2 rightBottom;
leftTop.x = -particle->scale.x;
leftTop.y = -particle->scale.y;
leftTop.x = context->particleSize * -particle->scale.x / 4;
leftTop.y = context->particleSize * -particle->scale.y / 4;
rightTop.x = particle->scale.x;
rightTop.y = -particle->scale.y;
rightTop.x = context->particleSize * particle->scale.x / 4;
rightTop.y = context->particleSize * -particle->scale.y / 4;
leftBottom.x = -particle->scale.x;
leftBottom.y = particle->scale.y;
leftBottom.x = context->particleSize * -particle->scale.x / 4;
leftBottom.y = context->particleSize * particle->scale.y / 4;
rightBottom.x = particle->scale.x;
rightBottom.y = particle->scale.y;
rightBottom.x = context->particleSize * particle->scale.x / 4;
rightBottom.y = context->particleSize * particle->scale.y / 4;
Snowstorm_Matrix3x2 translation = Matrix3x2_CreateTranslation(particle->position.x, particle->position.y);
Snowstorm_Matrix3x2 rotation = Matrix3x2_CreateRotation(particle->rotation);
Snowstorm_Matrix3x2 transform = Matrix3x2_Multiply(translation, rotation);
Snowstorm_Matrix3x2 transform = Matrix3x2_Multiply(rotation, translation);
leftTop = Vector2_Transform(leftTop, transform);
rightTop = Vector2_Transform(rightTop, transform);
@ -536,9 +552,9 @@ double Snowstorm_FillSnowBuffer(const char *contextPointer)
return (double)vertexCount;
}
void Snowstorm_Destroy(const char *contextPointer)
void Snowstorm_Destroy(double contextId)
{
Snowstorm_Context* context = (Snowstorm_Context*)contextPointer;
Snowstorm_Context* context = &contexts[(uint32_t)contextId];
if (context->particles != NULL)
{
@ -549,6 +565,4 @@ void Snowstorm_Destroy(const char *contextPointer)
{
free(context->uvs);
}
free(context);
}

View File

@ -57,23 +57,24 @@ extern "C" {
)
SNOWSTORMAPI void Snowstorm_Init();
SNOWSTORMAPI const char* Snowstorm_Create(); /* have to return a string because game maker lol */
SNOWSTORMAPI void Snowstorm_SetUVCount(const char *contextPointer, double count);
SNOWSTORMAPI double Snowstorm_Create(double particleSize, double leftBound, double topBound, double rightBound, double bottomBound);
SNOWSTORMAPI void Snowstorm_SetUVCount(double contextId, double count);
/* i split these up because game maker cant have more than 4 arguments with different types lol */
SNOWSTORMAPI void Snowstorm_SetLeftTopUV(const char *contextPointer, double index, double left, double top);
SNOWSTORMAPI void Snowstorm_SetRightBottomUV(const char* contextPointer, double index, double right, double bottom);
SNOWSTORMAPI void Snowstorm_SetLeftTopUV(double contextId, double index, double left, double top);
SNOWSTORMAPI void Snowstorm_SetRightBottomUV(double contextId, double index, double right, double bottom);
SNOWSTORMAPI void Snowstorm_Update(const char *contextPointer);
SNOWSTORMAPI void Snowstorm_ApplyWind(const char *contextPointer, double xSpeed, double ySpeed);
SNOWSTORMAPI void Snowstorm_ApplyChaos(const char* contextPointer, double directionChaos, double speedChaos);
SNOWSTORMAPI void Snowstorm_SetParticles(const char *contextPointer, double count);
SNOWSTORMAPI void Snowstorm_Update(double contextId);
SNOWSTORMAPI void Snowstorm_ApplyWind(double contextId, double xSpeed, double ySpeed);
SNOWSTORMAPI void Snowstorm_ApplyChaos(double contextId, double directionChaos, double speedChaos);
SNOWSTORMAPI void Snowstorm_SetParticles(double contextId, double count);
SNOWSTORMAPI void Snowstorm_SetBufferAddress(const char *contextPointer, const char* bufferId);
SNOWSTORMAPI void Snowstorm_SetBufferAddress(double contextId, const char* bufferId);
SNOWSTORMAPI double Snowstorm_RequiredSnowBufferSize(const char *contextPointer);
SNOWSTORMAPI double Snowstorm_FillSnowBuffer(const char *contextPointer);
SNOWSTORMAPI double Snowstorm_RequiredSnowBufferSize(double contextId);
SNOWSTORMAPI double Snowstorm_FillSnowBuffer(double contextId, double red, double green, double blue);
SNOWSTORMAPI void Snowstorm_Destroy(const char *contextPointer);
SNOWSTORMAPI void Snowstorm_Destroy(double contextId);
#ifdef __cplusplus
}

View File

@ -45,7 +45,7 @@
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>ClangCL</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">