destruction data for destroy callbacks
parent
47ceb50cd9
commit
b96860705d
|
@ -318,6 +318,15 @@ typedef struct Silkworm_Context
|
|||
uint32_t clothDensity;
|
||||
|
||||
uint8_t* currentBufferAddress; /* GM doesnt let you pass more than 4 arguments with different types lol */
|
||||
|
||||
/* keep track of these so can do callbacks */
|
||||
Silkworm_Vector2* nodeDestructionData;
|
||||
uint32_t nodeDestructionDataCount;
|
||||
uint32_t nodeDestructionDataCapacity;
|
||||
|
||||
Silkworm_Vector2* linkDestructionData;
|
||||
uint32_t linkDestructionDataCount;
|
||||
uint32_t linkDestructionDataCapacity;
|
||||
} Silkworm_Context;
|
||||
|
||||
static Silkworm_Context *context = NULL;
|
||||
|
@ -353,6 +362,14 @@ void Silkworm_Init()
|
|||
context->xBound = 1000;
|
||||
context->yBound = 1000;
|
||||
context->clothDensity = 4;
|
||||
|
||||
context->nodeDestructionDataCapacity = 16;
|
||||
context->nodeDestructionData = malloc(sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
||||
context->nodeDestructionDataCount = 0;
|
||||
|
||||
context->linkDestructionDataCapacity = 16;
|
||||
context->linkDestructionData = malloc(sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
||||
context->linkDestructionDataCount = 0;
|
||||
}
|
||||
|
||||
static inline Silkworm_Node* LookupNode(uint64_t nodeId)
|
||||
|
@ -394,6 +411,18 @@ void Silkworm_DestroyNode(double nodeId)
|
|||
void Silkworm_Internal_DestroyLink(Silkworm_Link* link)
|
||||
{
|
||||
link->markedForDestroy = true;
|
||||
|
||||
if (context->linkDestructionDataCount >= context->linkDestructionDataCapacity)
|
||||
{
|
||||
context->linkDestructionDataCapacity *= 2;
|
||||
context->linkDestructionData = realloc(context->linkDestructionData, sizeof(Silkworm_Vector2) * context->linkDestructionDataCapacity);
|
||||
}
|
||||
|
||||
Silkworm_Vector2 position;
|
||||
position.x = (link->a->position.x + link->b->position.x) / 2;
|
||||
position.y = (link->a->position.y + link->b->position.y) / 2;
|
||||
context->linkDestructionData[context->linkDestructionDataCount] = position;
|
||||
context->linkDestructionDataCount += 1;
|
||||
}
|
||||
|
||||
void Silkworm_DestroyLink(double linkId)
|
||||
|
@ -580,6 +609,9 @@ void Silkworm_Update(double deltaTime)
|
|||
Silkworm_Link *link;
|
||||
Silkworm_Node *node;
|
||||
|
||||
context->nodeDestructionDataCount = 0;
|
||||
context->linkDestructionDataCount = 0;
|
||||
|
||||
float delta = (float)deltaTime;
|
||||
|
||||
for (i = 0; i < CONSTRAINT_ITERATION_COUNT; i += 1)
|
||||
|
@ -1449,6 +1481,16 @@ void Silkworm_DestroyNodesInRadius(double x, double y, double radius)
|
|||
if (squareDistance <= radius * radius)
|
||||
{
|
||||
Silkworm_DestroyNode(i);
|
||||
|
||||
if (context->nodeDestructionDataCount >= context->nodeDestructionDataCapacity)
|
||||
{
|
||||
context->nodeDestructionDataCapacity *= 2;
|
||||
context->nodeDestructionData = realloc(context->nodeDestructionData, sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
||||
|
||||
}
|
||||
|
||||
context->nodeDestructionData[context->nodeDestructionDataCount] = node->position;
|
||||
context->nodeDestructionDataCount += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1505,6 +1547,44 @@ double Silkworm_DestroyClothInRadius(double x, double y, double radius)
|
|||
return clothId;
|
||||
}
|
||||
|
||||
double Silkworm_NodeDestructionDataBufferRequiredSize()
|
||||
{
|
||||
return context->nodeDestructionDataCount * (double)sizeof(Silkworm_Vector2);
|
||||
}
|
||||
|
||||
double Silkworm_FillNodeDestructionDataBuffer()
|
||||
{
|
||||
uint32_t i;
|
||||
uint8_t* bufferAddress = context->currentBufferAddress;
|
||||
|
||||
for (i = 0; i < context->nodeDestructionDataCount; i += 1)
|
||||
{
|
||||
memcpy(bufferAddress, &context->nodeDestructionData[i], sizeof(Silkworm_Vector2));
|
||||
bufferAddress += sizeof(Silkworm_Vector2);
|
||||
}
|
||||
|
||||
return (double)i;
|
||||
}
|
||||
|
||||
double Silkworm_LinkDestructionDataBufferRequiredSize()
|
||||
{
|
||||
return context->linkDestructionDataCount * (double)sizeof(Silkworm_Vector2);
|
||||
}
|
||||
|
||||
double Silkworm_FillLinkDestructionDataBuffer()
|
||||
{
|
||||
uint32_t i;
|
||||
uint8_t* bufferAddress = context->currentBufferAddress;
|
||||
|
||||
for (i = 0; i < context->linkDestructionDataCount; i += 1)
|
||||
{
|
||||
memcpy(bufferAddress, &context->linkDestructionData[i], sizeof(Silkworm_Vector2));
|
||||
bufferAddress += sizeof(Silkworm_Vector2);
|
||||
}
|
||||
|
||||
return (double)i;
|
||||
}
|
||||
|
||||
void Silkworm_ClearAll()
|
||||
{
|
||||
uint32_t i;
|
||||
|
@ -1532,6 +1612,9 @@ void Silkworm_Finish()
|
|||
free(context->linkIndexStack);
|
||||
free(context->clothIndexStack);
|
||||
|
||||
free(context->nodeDestructionData);
|
||||
free(context->linkDestructionData);
|
||||
|
||||
free(context);
|
||||
context = NULL;
|
||||
}
|
|
@ -90,6 +90,12 @@ SILKWORMAPI void Silkworm_PushNodesInRadius(double x, double y, double radius, d
|
|||
SILKWORMAPI void Silkworm_DestroyNodesInRadius(double x, double y, double radius);
|
||||
SILKWORMAPI double Silkworm_DestroyClothInRadius(double x, double y, double radius);
|
||||
|
||||
SILKWORMAPI double Silkworm_NodeDestructionDataBufferRequiredSize();
|
||||
SILKWORMAPI double Silkworm_FillNodeDestructionDataBuffer();
|
||||
|
||||
SILKWORMAPI double Silkworm_LinkDestructionDataBufferRequiredSize();
|
||||
SILKWORMAPI double Silkworm_FillLinkDestructionDataBuffer();
|
||||
|
||||
SILKWORMAPI void Silkworm_ClearAll();
|
||||
SILKWORMAPI void Silkworm_Finish();
|
||||
|
||||
|
|
Loading…
Reference in New Issue