From 95c89d3ce198962c6e34b48a6dcabe7782c3bf4a Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Fri, 24 Sep 2021 16:42:24 -0700 Subject: [PATCH] editor view buffer --- src/Silkworm.c | 195 ++++++++++++++++++++++++++++++++++++++++++++++++- src/Silkworm.h | 3 + 2 files changed, 197 insertions(+), 1 deletion(-) diff --git a/src/Silkworm.c b/src/Silkworm.c index 9d6927a..bac633f 100644 --- a/src/Silkworm.c +++ b/src/Silkworm.c @@ -1087,7 +1087,200 @@ double Silkworm_ClothFillTriangleBuffer(double clothId, double leftUV, double wi } } - return (double)triangleCount; + return (double)triangleCount * 3; +} + +/* in bytes */ +double Silkworm_GetEditorBufferRequiredSize() +{ + return 72 * context->nodeCount + 72 * context->linkCount; +} + +/* position, color */ +double Silkworm_FillEditorBuffer() +{ + uint32_t i, triangleCount; + uint8_t* bufferAddress = context->currentBufferAddress; + + Silkworm_Vector2 position; + position.x = 0; + position.y = 0; + + Silkworm_Color color; + color.r = 0; + color.g = 0; + color.b = 255; + color.a = 255; + + triangleCount = 0; + + /* draw links */ + for (i = 0; i < context->linkCount; i += 1) + { + Silkworm_Link* link = context->links[i]; + + if (link != NULL) + { + /* top left triangle */ + float left, right, top, bottom; + + if (link->a->position.y < link->b->position.y) + { + top = link->a->position.y; + bottom = link->b->position.y; + } + else + { + top = link->b->position.y; + bottom = link->a->position.y; + } + + if (link->a->position.x < link->b->position.x) + { + left = link->a->position.x; + right = link->b->position.x; + } + else + { + left = link->b->position.x; + right = link->a->position.x; + } + + /* upper left triangle */ + position.x = left; + position.y = top; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = right; + position.y = top; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = left; + position.y = bottom; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + triangleCount += 1; + + /* bottom right triangle */ + position.x = left; + position.y = bottom; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = right; + position.y = top; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = right; + position.y = bottom; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + triangleCount += 1; + } + } + + color.r = 255; + color.b = 0; + + /* draw nodes */ + for (i = 0; i < context->nodeCount; i += 1) + { + Silkworm_Node* node = context->nodes[i]; + + if (node != NULL) + { + /* top left triangle */ + position.x = node->position.x - node->radius; + position.y = node->position.y - node->radius; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = node->position.x + node->radius; + position.y = node->position.y - node->radius; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = node->position.x - node->radius; + position.y = node->position.y + node->radius; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + triangleCount += 1; + + /* bottom right triangle */ + position.x = node->position.x - node->radius; + position.y = node->position.y + node->radius; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = node->position.x + node->radius; + position.y = node->position.y - node->radius; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + position.x = node->position.x + node->radius; + position.y = node->position.y + node->radius; + + memcpy(bufferAddress, &position, sizeof(Silkworm_Vector2)); + bufferAddress += sizeof(Silkworm_Vector2); + + memcpy(bufferAddress, &color, sizeof(Silkworm_Color)); + bufferAddress += sizeof(Silkworm_Color); + + triangleCount += 1; + } + } + + return (double)triangleCount * 3; } void Silkworm_PushNodesInRadius(double x, double y, double radius, double xDirection, double yDirection) diff --git a/src/Silkworm.h b/src/Silkworm.h index 74dc77d..bf65f90 100644 --- a/src/Silkworm.h +++ b/src/Silkworm.h @@ -75,6 +75,9 @@ SILKWORMAPI void Silkworm_DestroyCloth(double clothId); SILKWORMAPI void Silkworm_SetTriangleBuffer(const char* bufferId); SILKWORMAPI double Silkworm_ClothFillTriangleBuffer(double clothId, double leftUV, double widthUV, double topUV, double heightUV); +SILKWORMAPI double Silkworm_GetEditorBufferRequiredSize(); +SILKWORMAPI double Silkworm_FillEditorBuffer(); + SILKWORMAPI void Silkworm_DestroyNode(double nodeId); SILKWORMAPI void Silkworm_PushNodesInRadius(double x, double y, double radius, double xDirection, double yDirection);