destroy nodes with rectangle
parent
18b84ca0c4
commit
65f84abdae
|
@ -445,7 +445,7 @@ void Silkworm_DestroyNode(void* nodePtr)
|
|||
}
|
||||
}
|
||||
|
||||
void Silkworm_Internal_DestroyLink(Silkworm_Link* link)
|
||||
void Silkworm_DestroyLink(Silkworm_Link* link)
|
||||
{
|
||||
link->markedForDestroy = true;
|
||||
|
||||
|
@ -462,11 +462,6 @@ void Silkworm_Internal_DestroyLink(Silkworm_Link* link)
|
|||
context->linkDestructionDataCount += 1;
|
||||
}
|
||||
|
||||
void Silkworm_DestroyLink(double linkId)
|
||||
{
|
||||
Silkworm_Internal_DestroyLink(LookupLink((uint64_t)linkId));
|
||||
}
|
||||
|
||||
void Silkworm_ClothDestroy(void* clothPtr)
|
||||
{
|
||||
uint32_t i, j;
|
||||
|
@ -627,7 +622,7 @@ void Silkworm_PerformDestroys()
|
|||
|
||||
cloth->nodes[node->clothReference.horizontalIndex][node->clothReference.verticalIndex] = NULL;
|
||||
}
|
||||
|
||||
|
||||
free(context->nodes[i]->links);
|
||||
free(context->nodes[i]);
|
||||
context->nodes[i] = NULL;
|
||||
|
@ -662,8 +657,10 @@ void Silkworm_Update(float delta, float windSpeedX, float windSpeedY)
|
|||
{
|
||||
if (!node->pinned)
|
||||
{
|
||||
node->position.x += (0.5f * sinf(context->timeElapsed * 4 + node->position.y / 2) + 0.5f) * windSpeedX * delta * 0.05f * node->windFactor;
|
||||
node->position.y += (0.5f * sinf(context->timeElapsed * 4 + node->position.x / 3) + 0.5f) * windSpeedY * delta * 0.05f * node->windFactor;
|
||||
float windFactorX = 0.5f * sinf(context->timeElapsed * 4 + node->position.y / 2) + 0.5f;
|
||||
float windFactorY = 0.5f * sinf(context->timeElapsed * 4 + node->position.x / 3) + 0.5f;
|
||||
node->position.x += windFactorX * windSpeedX * delta * 0.05f * node->windFactor;
|
||||
node->position.y += windFactorY * windSpeedY * delta * 0.05f * node->windFactor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -690,7 +687,7 @@ void Silkworm_Update(float delta, float windSpeedX, float windSpeedY)
|
|||
|
||||
if (distanceMovedSquared > link->tearThreshold * link->tearThreshold)
|
||||
{
|
||||
Silkworm_DestroyLink((double)link->id);
|
||||
Silkworm_DestroyLink(link);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -918,7 +915,7 @@ void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo)
|
|||
nodeCreateInfo.friction = clothCreateInfo->friction;
|
||||
nodeCreateInfo.mass = clothCreateInfo->mass;
|
||||
nodeCreateInfo.pinned = false;
|
||||
nodeCreateInfo.pushFactor = 0;
|
||||
nodeCreateInfo.pushFactor = 1;
|
||||
nodeCreateInfo.radius = 1;
|
||||
nodeCreateInfo.windFactor = clothCreateInfo->windFactor;
|
||||
|
||||
|
@ -1142,7 +1139,7 @@ uint32_t Silkworm_ClothRender(void **pVertexBuffer, uint32_t *pVertexBufferLengt
|
|||
*pVertexBuffer = context->vertexBuffer;
|
||||
*pVertexBufferLengthInBytes = sizeof(Silkworm_Vertex) * vertexCount;
|
||||
}
|
||||
|
||||
|
||||
return vertexCount;
|
||||
}
|
||||
|
||||
|
@ -1259,6 +1256,40 @@ void Silkworm_DestroyNodesInRadius(float x, float y, float radius)
|
|||
Silkworm_PerformDestroys();
|
||||
}
|
||||
|
||||
void Silkworm_DestroyNodesInRectangle(Silkworm_Rectangle* rectangle)
|
||||
{
|
||||
/* TODO: spatial hash implementation */
|
||||
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < context->nodeCount; i += 1)
|
||||
{
|
||||
Silkworm_Node* node = context->nodes[i];
|
||||
|
||||
if (node != NULL && node->destroyable)
|
||||
{
|
||||
if (
|
||||
node->position.x >= rectangle->x &&
|
||||
node->position.x <= rectangle->x + rectangle->w &&
|
||||
node->position.y >= rectangle->y &&
|
||||
node->position.y <= rectangle->y + rectangle->h
|
||||
) {
|
||||
Silkworm_DestroyNode(node);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void* Silkworm_FindClothInRadius(float x, float y, float radius)
|
||||
{
|
||||
/* TODO: spatial hash implementation */
|
||||
|
|
|
@ -86,6 +86,14 @@ typedef struct Silkworm_ClothCreateInfo
|
|||
float bottomUV;
|
||||
} Silkworm_ClothCreateInfo;
|
||||
|
||||
typedef struct Silkworm_Rectangle
|
||||
{
|
||||
float x;
|
||||
float y;
|
||||
float w;
|
||||
float h;
|
||||
} Silkworm_Rectangle;
|
||||
|
||||
typedef struct Silkworm_Vertex
|
||||
{
|
||||
float x;
|
||||
|
@ -107,14 +115,16 @@ SILKWORMAPI void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo
|
|||
SILKWORMAPI void Silkworm_ClothNodePin(void* clothPtr, uint32_t i, uint32_t j);
|
||||
SILKWORMAPI void Silkworm_ClothNodeUnpin(void* clothPtr, uint32_t i, uint32_t j);
|
||||
SILKWORMAPI void Silkworm_ClothNodeDestroy(void* clothPtr, uint32_t i, uint32_t j);
|
||||
SILKWORMAPI uint32_t Silkworm_ClothRender(void **pVertexBuffer, uint32_t *pVertexBufferLengthInBytes);
|
||||
SILKWORMAPI void Silkworm_ClothDestroy(void* clothPtr);
|
||||
|
||||
SILKWORMAPI uint32_t Silkworm_ClothRender(void** pVertexBuffer, uint32_t* pVertexBufferLengthInBytes);
|
||||
|
||||
SILKWORMAPI void Silkworm_PinNodesInRadius(float x, float y, float radius);
|
||||
SILKWORMAPI void Silkworm_UnpinNodesInRadius(float x, float y, float radius);
|
||||
SILKWORMAPI void Silkworm_PushNodesInRadius(float x, float y, float radius, float xDirection, float yDirection);
|
||||
SILKWORMAPI void Silkworm_DestroyNodesInRadius(float x, float y, float radius);
|
||||
SILKWORMAPI void* Silkworm_FindClothInRadius(float x, float y, float radius);
|
||||
SILKWORMAPI void Silkworm_DestroyNodesInRadius(float x, float y, float radius);
|
||||
SILKWORMAPI void Silkworm_DestroyNodesInRectangle(Silkworm_Rectangle* rectangle);
|
||||
|
||||
SILKWORMAPI void Silkworm_PerformDestroys();
|
||||
SILKWORMAPI void Silkworm_ClearAll();
|
||||
|
|
Loading…
Reference in New Issue