ABI refactor because game maker is silly
parent
85de1d89c2
commit
d9e69c8f05
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in New Issue