cmake config + optional SDL2 dependency
parent
65f84abdae
commit
01d1848b11
|
@ -0,0 +1,89 @@
|
||||||
|
cmake_minimum_required(VERSION 2.8.12)
|
||||||
|
project(Silkworm2 C)
|
||||||
|
|
||||||
|
option(BUILD_SHARED_LIBS "Build shared library" ON)
|
||||||
|
option(USE_SDL2 "Use SDL2" ON)
|
||||||
|
|
||||||
|
SET(LIB_MAJOR_VERSION "0")
|
||||||
|
SET(LIB_MINOR_VERSION "1")
|
||||||
|
SET(LIB_REVISION "0")
|
||||||
|
SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
|
||||||
|
|
||||||
|
# Build Type
|
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
# By default, we use Release
|
||||||
|
message(STATUS "Setting build type to 'Release' as none was specified.")
|
||||||
|
set(CMAKE_BUILD_TYPE "Release" CACHE
|
||||||
|
STRING "Choose the type of build." FORCE
|
||||||
|
)
|
||||||
|
# Set the possible values of build type for cmake-gui
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
|
||||||
|
STRINGS "Debug" "Release" "RelWithDebInfo"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Platform Flags
|
||||||
|
if(APPLE)
|
||||||
|
set(CMAKE_MACOSX_RPATH ON)
|
||||||
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
|
||||||
|
set(LOBJC "objc")
|
||||||
|
elseif(WIN32)
|
||||||
|
# "Silkworm2.dll", not "libSilkworm2.dll"
|
||||||
|
set(CMAKE_SHARED_LIBRARY_PREFIX "")
|
||||||
|
endif()
|
||||||
|
if(UNIX)
|
||||||
|
set(CMAKE_SKIP_BUILD_RPATH TRUE)
|
||||||
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||||
|
set(CMAKE_INSTALL_RPATH ${BIN_RPATH})
|
||||||
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(USE_SDL2)
|
||||||
|
add_definitions(-DUSE_SDL2)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(Silkworm2
|
||||||
|
#Public header
|
||||||
|
src/Silkworm2.h
|
||||||
|
#Source
|
||||||
|
src/Silkworm2.c
|
||||||
|
)
|
||||||
|
|
||||||
|
# Build flags
|
||||||
|
if(NOT MSVC)
|
||||||
|
set_property(TARGET Silkworm2 PROPERTY COMPILE_FLAGS "-std=gnu99 -Wall -Wno-strict-aliasing -pedantic")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# includes
|
||||||
|
target_include_directories(Silkworm2 PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
||||||
|
)
|
||||||
|
|
||||||
|
# Soname
|
||||||
|
set_target_properties(Silkworm2 PROPERTIES OUTPUT_NAME "Silkworm2"
|
||||||
|
VERSION ${LIB_VERSION}
|
||||||
|
SOVERSION ${LIB_MAJOR_VERSION}
|
||||||
|
)
|
||||||
|
|
||||||
|
# SDL2 Dependency
|
||||||
|
if(USE_SDL2)
|
||||||
|
if (DEFINED SDL2_INCLUDE_DIRS AND DEFINED SDL2_LIBRARIES)
|
||||||
|
message(STATUS "using pre-defined SDL2 variables SDL2_INCLUDE_DIRS and SDL2_LIBRARIES")
|
||||||
|
target_include_directories(Silkworm2 PUBLIC "$<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>")
|
||||||
|
target_link_libraries(Silkworm2 PUBLIC ${SDL2_LIBRARIES})
|
||||||
|
else()
|
||||||
|
# Only try to autodetect if both SDL2 variables aren't explicitly set
|
||||||
|
find_package(SDL2 CONFIG)
|
||||||
|
if (TARGET SDL2::SDL2)
|
||||||
|
message(STATUS "using TARGET SDL2::SDL2")
|
||||||
|
target_link_libraries(Silkworm2 PUBLIC SDL2::SDL2)
|
||||||
|
elseif (TARGET SDL2)
|
||||||
|
message(STATUS "using TARGET SDL2")
|
||||||
|
target_link_libraries(Silkworm2 PUBLIC SDL2)
|
||||||
|
else()
|
||||||
|
message(STATUS "no TARGET SDL2::SDL2, or SDL2, using variables")
|
||||||
|
target_include_directories(Silkworm2 PUBLIC "$<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>")
|
||||||
|
target_link_libraries(Silkworm2 PUBLIC ${SDL2_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
|
@ -4,6 +4,10 @@ Silkworm2 is a cloth physics simulation system that was designed for the game Sa
|
||||||
|
|
||||||
What if we weren't constrained by the absolute garbage FFI system of Game Maker Studio 2? This library answers that question.
|
What if we weren't constrained by the absolute garbage FFI system of Game Maker Studio 2? This library answers that question.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Silkworm2 optionally depends on SDL2, but you can use the standard library if you so choose by disabling USE_SDL2.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This library is licensed under the zlib license. See LICENSE file for details.
|
This library is licensed under the zlib license. See LICENSE file for details.
|
||||||
|
|
170
src/Silkworm2.c
170
src/Silkworm2.c
|
@ -26,9 +26,31 @@
|
||||||
|
|
||||||
#include "Silkworm2.h"
|
#include "Silkworm2.h"
|
||||||
|
|
||||||
|
/* Function defines */
|
||||||
|
|
||||||
|
#ifdef USE_SDL2
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#define Silkworm_malloc SDL_malloc
|
||||||
|
#define Silkworm_realloc SDL_realloc
|
||||||
|
#define Silkworm_free SDL_free
|
||||||
|
#define Silkworm_sin SDL_sin
|
||||||
|
#define Silkworm_fabs SDL_fabs
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#define Silkworm_malloc malloc
|
||||||
|
#define Silkworm_realloc realloc
|
||||||
|
#define Silkworm_free free
|
||||||
|
#define Silkworm_sin sinf
|
||||||
|
#define Silkworm_fabs fabs
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PI 3.14159265358979323846
|
#define PI 3.14159265358979323846
|
||||||
|
|
||||||
typedef struct Silkworm_Vector2
|
typedef struct Silkworm_Vector2
|
||||||
|
@ -37,14 +59,6 @@ typedef struct Silkworm_Vector2
|
||||||
float y;
|
float y;
|
||||||
} Silkworm_Vector2;
|
} Silkworm_Vector2;
|
||||||
|
|
||||||
static inline Silkworm_Vector2 Vector2_Rotate(Silkworm_Vector2 vector, float angle)
|
|
||||||
{
|
|
||||||
Silkworm_Vector2 rotated;
|
|
||||||
rotated.x = vector.x * cosf(angle) - vector.y * sinf(angle);
|
|
||||||
rotated.y = vector.x * sinf(angle) + vector.y * cosf(angle);
|
|
||||||
return rotated;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline Silkworm_Vector2 Vector2_Normalize(Silkworm_Vector2 vector)
|
static inline Silkworm_Vector2 Vector2_Normalize(Silkworm_Vector2 vector)
|
||||||
{
|
{
|
||||||
float length = sqrtf(vector.x * vector.x + vector.y * vector.y);
|
float length = sqrtf(vector.x * vector.x + vector.y * vector.y);
|
||||||
|
@ -184,7 +198,7 @@ static inline void NodeTriangleHashTable_Insert(
|
||||||
{
|
{
|
||||||
if (arr->elements[i].key == key)
|
if (arr->elements[i].key == key)
|
||||||
{
|
{
|
||||||
arr->elements[i].indexArray = realloc(arr->elements[i].indexArray, sizeof(uint32_t) * (arr->elements[i].indexArrayCount + 1));
|
arr->elements[i].indexArray = Silkworm_realloc(arr->elements[i].indexArray, sizeof(uint32_t) * (arr->elements[i].indexArrayCount + 1));
|
||||||
arr->elements[i].indexArray[arr->elements[i].indexArrayCount] = index;
|
arr->elements[i].indexArray[arr->elements[i].indexArrayCount] = index;
|
||||||
arr->elements[i].indexArrayCount += 1;
|
arr->elements[i].indexArrayCount += 1;
|
||||||
foundKey = true;
|
foundKey = true;
|
||||||
|
@ -194,10 +208,10 @@ static inline void NodeTriangleHashTable_Insert(
|
||||||
|
|
||||||
if (!foundKey)
|
if (!foundKey)
|
||||||
{
|
{
|
||||||
arr->elements = realloc(arr->elements, sizeof(NodeTriangleHashMap) * (arr->count + 1));
|
arr->elements = Silkworm_realloc(arr->elements, sizeof(NodeTriangleHashMap) * (arr->count + 1));
|
||||||
|
|
||||||
arr->elements[arr->count].key = key;
|
arr->elements[arr->count].key = key;
|
||||||
arr->elements[arr->count].indexArray = malloc(sizeof(uint32_t));
|
arr->elements[arr->count].indexArray = Silkworm_malloc(sizeof(uint32_t));
|
||||||
arr->elements[arr->count].indexArray[0] = index;
|
arr->elements[arr->count].indexArray[0] = index;
|
||||||
arr->elements[arr->count].indexArrayCount = 1;
|
arr->elements[arr->count].indexArrayCount = 1;
|
||||||
|
|
||||||
|
@ -266,7 +280,7 @@ static inline void LinkTriangleHashTable_Insert(
|
||||||
{
|
{
|
||||||
if (arr->elements[i].key == key)
|
if (arr->elements[i].key == key)
|
||||||
{
|
{
|
||||||
arr->elements[i].indexArray = realloc(arr->elements[i].indexArray, sizeof(uint32_t) * (arr->elements[i].indexArrayCount + 1));
|
arr->elements[i].indexArray = Silkworm_realloc(arr->elements[i].indexArray, sizeof(uint32_t) * (arr->elements[i].indexArrayCount + 1));
|
||||||
arr->elements[i].indexArray[arr->elements[i].indexArrayCount] = index;
|
arr->elements[i].indexArray[arr->elements[i].indexArrayCount] = index;
|
||||||
arr->elements[i].indexArrayCount += 1;
|
arr->elements[i].indexArrayCount += 1;
|
||||||
foundKey = true;
|
foundKey = true;
|
||||||
|
@ -276,10 +290,10 @@ static inline void LinkTriangleHashTable_Insert(
|
||||||
|
|
||||||
if (!foundKey)
|
if (!foundKey)
|
||||||
{
|
{
|
||||||
arr->elements = realloc(arr->elements, sizeof(LinkTriangleHashMap) * (arr->count + 1));
|
arr->elements = Silkworm_realloc(arr->elements, sizeof(LinkTriangleHashMap) * (arr->count + 1));
|
||||||
|
|
||||||
arr->elements[arr->count].key = key;
|
arr->elements[arr->count].key = key;
|
||||||
arr->elements[arr->count].indexArray = malloc(sizeof(uint32_t));
|
arr->elements[arr->count].indexArray = Silkworm_malloc(sizeof(uint32_t));
|
||||||
arr->elements[arr->count].indexArray[0] = index;
|
arr->elements[arr->count].indexArray[0] = index;
|
||||||
arr->elements[arr->count].indexArrayCount = 1;
|
arr->elements[arr->count].indexArrayCount = 1;
|
||||||
|
|
||||||
|
@ -368,7 +382,7 @@ static Silkworm_Context *context = NULL;
|
||||||
|
|
||||||
void Silkworm_Init()
|
void Silkworm_Init()
|
||||||
{
|
{
|
||||||
context = malloc(sizeof(Silkworm_Context));
|
context = Silkworm_malloc(sizeof(Silkworm_Context));
|
||||||
|
|
||||||
context->nodes = NULL;
|
context->nodes = NULL;
|
||||||
context->nodeCount = 0;
|
context->nodeCount = 0;
|
||||||
|
@ -380,15 +394,15 @@ void Silkworm_Init()
|
||||||
context->clothCount = 0;
|
context->clothCount = 0;
|
||||||
|
|
||||||
context->nodeIndexStackCapacity = 16;
|
context->nodeIndexStackCapacity = 16;
|
||||||
context->nodeIndexStack = malloc(sizeof(uint64_t) * context->nodeIndexStackCapacity);
|
context->nodeIndexStack = Silkworm_malloc(sizeof(uint64_t) * context->nodeIndexStackCapacity);
|
||||||
context->nodeIndexStackCount = 0;
|
context->nodeIndexStackCount = 0;
|
||||||
|
|
||||||
context->linkIndexStackCapacity = 16;
|
context->linkIndexStackCapacity = 16;
|
||||||
context->linkIndexStack = malloc(sizeof(uint64_t) * context->linkIndexStackCapacity);
|
context->linkIndexStack = Silkworm_malloc(sizeof(uint64_t) * context->linkIndexStackCapacity);
|
||||||
context->linkIndexStackCount = 0;
|
context->linkIndexStackCount = 0;
|
||||||
|
|
||||||
context->clothIndexStackCapacity = 16;
|
context->clothIndexStackCapacity = 16;
|
||||||
context->clothIndexStack = malloc(sizeof(uint64_t) * context->clothIndexStackCapacity);
|
context->clothIndexStack = Silkworm_malloc(sizeof(uint64_t) * context->clothIndexStackCapacity);
|
||||||
context->clothIndexStackCount = 0;
|
context->clothIndexStackCount = 0;
|
||||||
|
|
||||||
context->gravity = 200;
|
context->gravity = 200;
|
||||||
|
@ -398,15 +412,15 @@ void Silkworm_Init()
|
||||||
context->timeElapsed = 0;
|
context->timeElapsed = 0;
|
||||||
|
|
||||||
context->nodeDestructionDataCapacity = 16;
|
context->nodeDestructionDataCapacity = 16;
|
||||||
context->nodeDestructionData = malloc(sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
context->nodeDestructionData = Silkworm_malloc(sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
||||||
context->nodeDestructionDataCount = 0;
|
context->nodeDestructionDataCount = 0;
|
||||||
|
|
||||||
context->linkDestructionDataCapacity = 16;
|
context->linkDestructionDataCapacity = 16;
|
||||||
context->linkDestructionData = malloc(sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
context->linkDestructionData = Silkworm_malloc(sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
||||||
context->linkDestructionDataCount = 0;
|
context->linkDestructionDataCount = 0;
|
||||||
|
|
||||||
context->vertexCapacity = 1024;
|
context->vertexCapacity = 1024;
|
||||||
context->vertexBuffer = malloc(sizeof(Silkworm_Vertex) * context->vertexCapacity);
|
context->vertexBuffer = Silkworm_malloc(sizeof(Silkworm_Vertex) * context->vertexCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Silkworm_Node* LookupNode(uint64_t nodeId)
|
static inline Silkworm_Node* LookupNode(uint64_t nodeId)
|
||||||
|
@ -452,7 +466,7 @@ void Silkworm_DestroyLink(Silkworm_Link* link)
|
||||||
if (context->linkDestructionDataCount >= context->linkDestructionDataCapacity)
|
if (context->linkDestructionDataCount >= context->linkDestructionDataCapacity)
|
||||||
{
|
{
|
||||||
context->linkDestructionDataCapacity *= 2;
|
context->linkDestructionDataCapacity *= 2;
|
||||||
context->linkDestructionData = realloc(context->linkDestructionData, sizeof(Silkworm_Vector2) * context->linkDestructionDataCapacity);
|
context->linkDestructionData = Silkworm_realloc(context->linkDestructionData, sizeof(Silkworm_Vector2) * context->linkDestructionDataCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
Silkworm_Vector2 position;
|
Silkworm_Vector2 position;
|
||||||
|
@ -476,11 +490,11 @@ void Silkworm_ClothDestroy(void* clothPtr)
|
||||||
{
|
{
|
||||||
for (j = 0; j < cloth->nodeHash.buckets[i].count; j += 1)
|
for (j = 0; j < cloth->nodeHash.buckets[i].count; j += 1)
|
||||||
{
|
{
|
||||||
free(cloth->nodeHash.buckets[i].elements[j].indexArray);
|
Silkworm_free(cloth->nodeHash.buckets[i].elements[j].indexArray);
|
||||||
}
|
}
|
||||||
if (cloth->nodeHash.buckets[i].elements != NULL)
|
if (cloth->nodeHash.buckets[i].elements != NULL)
|
||||||
{
|
{
|
||||||
free(cloth->nodeHash.buckets[i].elements);
|
Silkworm_free(cloth->nodeHash.buckets[i].elements);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,11 +502,11 @@ void Silkworm_ClothDestroy(void* clothPtr)
|
||||||
{
|
{
|
||||||
for (j = 0; j < cloth->linkHash.buckets[i].count; j += 1)
|
for (j = 0; j < cloth->linkHash.buckets[i].count; j += 1)
|
||||||
{
|
{
|
||||||
free(cloth->linkHash.buckets[i].elements[j].indexArray);
|
Silkworm_free(cloth->linkHash.buckets[i].elements[j].indexArray);
|
||||||
}
|
}
|
||||||
if (cloth->linkHash.buckets[i].elements != NULL)
|
if (cloth->linkHash.buckets[i].elements != NULL)
|
||||||
{
|
{
|
||||||
free(cloth->linkHash.buckets[i].elements);
|
Silkworm_free(cloth->linkHash.buckets[i].elements);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,29 +521,29 @@ void Silkworm_ClothDestroy(void* clothPtr)
|
||||||
Silkworm_DestroyNode(node);
|
Silkworm_DestroyNode(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(cloth->nodes[i]);
|
Silkworm_free(cloth->nodes[i]);
|
||||||
}
|
}
|
||||||
free(cloth->nodes);
|
Silkworm_free(cloth->nodes);
|
||||||
|
|
||||||
for (i = 0; i < cloth->triangleCount; i += 1)
|
for (i = 0; i < cloth->triangleCount; i += 1)
|
||||||
{
|
{
|
||||||
if (cloth->triangles[i] != NULL)
|
if (cloth->triangles[i] != NULL)
|
||||||
{
|
{
|
||||||
free(cloth->triangles[i]);
|
Silkworm_free(cloth->triangles[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(cloth->triangles);
|
Silkworm_free(cloth->triangles);
|
||||||
|
|
||||||
if (context->clothIndexStackCount >= context->clothIndexStackCapacity)
|
if (context->clothIndexStackCount >= context->clothIndexStackCapacity)
|
||||||
{
|
{
|
||||||
context->clothIndexStackCapacity *= 2;
|
context->clothIndexStackCapacity *= 2;
|
||||||
context->nodeIndexStack = realloc(context->nodeIndexStack, sizeof(uint64_t) * context->nodeIndexStackCapacity);
|
context->nodeIndexStack = Silkworm_realloc(context->nodeIndexStack, sizeof(uint64_t) * context->nodeIndexStackCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
context->clothIndexStack[context->clothIndexStackCount] = cloth->id;
|
context->clothIndexStack[context->clothIndexStackCount] = cloth->id;
|
||||||
context->clothIndexStackCount += 1;
|
context->clothIndexStackCount += 1;
|
||||||
|
|
||||||
free(cloth);
|
Silkworm_free(cloth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,7 +573,7 @@ void Silkworm_PerformDestroys()
|
||||||
|
|
||||||
if (cloth->triangles[triangleIndex] != NULL)
|
if (cloth->triangles[triangleIndex] != NULL)
|
||||||
{
|
{
|
||||||
free(cloth->triangles[triangleIndex]);
|
Silkworm_free(cloth->triangles[triangleIndex]);
|
||||||
cloth->triangles[triangleIndex] = NULL;
|
cloth->triangles[triangleIndex] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -582,13 +596,13 @@ void Silkworm_PerformDestroys()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(context->links[i]);
|
Silkworm_free(context->links[i]);
|
||||||
context->links[i] = NULL;
|
context->links[i] = NULL;
|
||||||
|
|
||||||
if (context->linkIndexStackCount >= context->linkIndexStackCapacity)
|
if (context->linkIndexStackCount >= context->linkIndexStackCapacity)
|
||||||
{
|
{
|
||||||
context->linkIndexStackCapacity *= 2;
|
context->linkIndexStackCapacity *= 2;
|
||||||
context->linkIndexStack = realloc(context->linkIndexStack, sizeof(uint64_t) * context->linkIndexStackCapacity);
|
context->linkIndexStack = Silkworm_realloc(context->linkIndexStack, sizeof(uint64_t) * context->linkIndexStackCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
context->linkIndexStack[context->linkIndexStackCount] = i;
|
context->linkIndexStack[context->linkIndexStackCount] = i;
|
||||||
|
@ -615,7 +629,7 @@ void Silkworm_PerformDestroys()
|
||||||
|
|
||||||
if (cloth->triangles[triangleIndex] != NULL)
|
if (cloth->triangles[triangleIndex] != NULL)
|
||||||
{
|
{
|
||||||
free(cloth->triangles[triangleIndex]);
|
Silkworm_free(cloth->triangles[triangleIndex]);
|
||||||
cloth->triangles[triangleIndex] = NULL;
|
cloth->triangles[triangleIndex] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -623,14 +637,14 @@ void Silkworm_PerformDestroys()
|
||||||
cloth->nodes[node->clothReference.horizontalIndex][node->clothReference.verticalIndex] = NULL;
|
cloth->nodes[node->clothReference.horizontalIndex][node->clothReference.verticalIndex] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(context->nodes[i]->links);
|
Silkworm_free(context->nodes[i]->links);
|
||||||
free(context->nodes[i]);
|
Silkworm_free(context->nodes[i]);
|
||||||
context->nodes[i] = NULL;
|
context->nodes[i] = NULL;
|
||||||
|
|
||||||
if (context->nodeIndexStackCount >= context->nodeIndexStackCapacity)
|
if (context->nodeIndexStackCount >= context->nodeIndexStackCapacity)
|
||||||
{
|
{
|
||||||
context->nodeIndexStackCapacity *= 2;
|
context->nodeIndexStackCapacity *= 2;
|
||||||
context->nodeIndexStack = realloc(context->nodeIndexStack, sizeof(uint64_t) * context->nodeIndexStackCapacity);
|
context->nodeIndexStack = Silkworm_realloc(context->nodeIndexStack, sizeof(uint64_t) * context->nodeIndexStackCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
context->nodeIndexStack[context->nodeIndexStackCount] = i;
|
context->nodeIndexStack[context->nodeIndexStackCount] = i;
|
||||||
|
@ -657,8 +671,8 @@ void Silkworm_Update(float delta, float windSpeedX, float windSpeedY)
|
||||||
{
|
{
|
||||||
if (!node->pinned)
|
if (!node->pinned)
|
||||||
{
|
{
|
||||||
float windFactorX = 0.5f * sinf(context->timeElapsed * 4 + node->position.y / 2) + 0.5f;
|
float windFactorX = 0.5f * Silkworm_sin(context->timeElapsed * 4 + node->position.y / 2) + 0.5f;
|
||||||
float windFactorY = 0.5f * sinf(context->timeElapsed * 4 + node->position.x / 3) + 0.5f;
|
float windFactorY = 0.5f * Silkworm_sin(context->timeElapsed * 4 + node->position.x / 3) + 0.5f;
|
||||||
node->position.x += windFactorX * windSpeedX * delta * 0.05f * node->windFactor;
|
node->position.x += windFactorX * windSpeedX * delta * 0.05f * node->windFactor;
|
||||||
node->position.y += windFactorY * windSpeedY * delta * 0.05f * node->windFactor;
|
node->position.y += windFactorY * windSpeedY * delta * 0.05f * node->windFactor;
|
||||||
}
|
}
|
||||||
|
@ -731,7 +745,7 @@ void Silkworm_Update(float delta, float windSpeedX, float windSpeedY)
|
||||||
node->velocity.x = velocityX * delta;
|
node->velocity.x = velocityX * delta;
|
||||||
node->velocity.y = velocityY * delta;
|
node->velocity.y = velocityY * delta;
|
||||||
|
|
||||||
if (fabs(node->position.x) > context->xBound || fabs(node->position.x) > context->yBound)
|
if (Silkworm_fabs(node->position.x) > context->xBound || Silkworm_fabs(node->position.x) > context->yBound)
|
||||||
{
|
{
|
||||||
Silkworm_DestroyNode(node);
|
Silkworm_DestroyNode(node);
|
||||||
}
|
}
|
||||||
|
@ -746,7 +760,7 @@ void Silkworm_Update(float delta, float windSpeedX, float windSpeedY)
|
||||||
|
|
||||||
void* Silkworm_CreateNode(Silkworm_NodeCreateInfo* nodeCreateInfo)
|
void* Silkworm_CreateNode(Silkworm_NodeCreateInfo* nodeCreateInfo)
|
||||||
{
|
{
|
||||||
Silkworm_Node* node = malloc(sizeof(Silkworm_Node));
|
Silkworm_Node* node = Silkworm_malloc(sizeof(Silkworm_Node));
|
||||||
uint64_t id;
|
uint64_t id;
|
||||||
|
|
||||||
if (context->nodeIndexStackCount > 0)
|
if (context->nodeIndexStackCount > 0)
|
||||||
|
@ -758,7 +772,7 @@ void* Silkworm_CreateNode(Silkworm_NodeCreateInfo* nodeCreateInfo)
|
||||||
{
|
{
|
||||||
id = context->nodeCount;
|
id = context->nodeCount;
|
||||||
|
|
||||||
context->nodes = realloc(context->nodes, sizeof(Silkworm_Node*) * (context->nodeCount + 1));
|
context->nodes = Silkworm_realloc(context->nodes, sizeof(Silkworm_Node*) * (context->nodeCount + 1));
|
||||||
context->nodeCount += 1;
|
context->nodeCount += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -824,7 +838,7 @@ void* Silkworm_CreateLink(void* nodeAPtr, void* nodeBPtr, float distance, float
|
||||||
|
|
||||||
uint64_t id;
|
uint64_t id;
|
||||||
|
|
||||||
Silkworm_Link* link = malloc(sizeof(Silkworm_Link));
|
Silkworm_Link* link = Silkworm_malloc(sizeof(Silkworm_Link));
|
||||||
|
|
||||||
if (context->linkIndexStackCount > 0)
|
if (context->linkIndexStackCount > 0)
|
||||||
{
|
{
|
||||||
|
@ -835,7 +849,7 @@ void* Silkworm_CreateLink(void* nodeAPtr, void* nodeBPtr, float distance, float
|
||||||
{
|
{
|
||||||
id = context->linkCount;
|
id = context->linkCount;
|
||||||
|
|
||||||
context->links = realloc(context->links, sizeof(Silkworm_Link*) * (context->linkCount + 1));
|
context->links = Silkworm_realloc(context->links, sizeof(Silkworm_Link*) * (context->linkCount + 1));
|
||||||
context->linkCount += 1;
|
context->linkCount += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -848,11 +862,11 @@ void* Silkworm_CreateLink(void* nodeAPtr, void* nodeBPtr, float distance, float
|
||||||
link->tearThreshold = (float)tearThreshold;
|
link->tearThreshold = (float)tearThreshold;
|
||||||
link->markedForDestroy = false;
|
link->markedForDestroy = false;
|
||||||
|
|
||||||
link->a->links = realloc(link->a->links, sizeof(Silkworm_Link*) * (link->a->linkCount + 1));
|
link->a->links = Silkworm_realloc(link->a->links, sizeof(Silkworm_Link*) * (link->a->linkCount + 1));
|
||||||
link->a->links[link->a->linkCount] = link;
|
link->a->links[link->a->linkCount] = link;
|
||||||
link->a->linkCount += 1;
|
link->a->linkCount += 1;
|
||||||
|
|
||||||
link->b->links = realloc(link->b->links, sizeof(Silkworm_Link*) * (link->b->linkCount + 1));
|
link->b->links = Silkworm_realloc(link->b->links, sizeof(Silkworm_Link*) * (link->b->linkCount + 1));
|
||||||
link->b->links[link->b->linkCount] = link;
|
link->b->links[link->b->linkCount] = link;
|
||||||
link->b->linkCount += 1;
|
link->b->linkCount += 1;
|
||||||
|
|
||||||
|
@ -864,12 +878,12 @@ void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo)
|
||||||
int32_t i, j, k, m;
|
int32_t i, j, k, m;
|
||||||
Silkworm_NodeCreateInfo nodeCreateInfo;
|
Silkworm_NodeCreateInfo nodeCreateInfo;
|
||||||
|
|
||||||
Silkworm_Cloth* cloth = malloc(sizeof(Silkworm_Cloth));
|
Silkworm_Cloth* cloth = Silkworm_malloc(sizeof(Silkworm_Cloth));
|
||||||
|
|
||||||
cloth->horizontalNodeCount = (uint32_t)clothCreateInfo->horizontalNodeCount;
|
cloth->horizontalNodeCount = (uint32_t)clothCreateInfo->horizontalNodeCount;
|
||||||
cloth->verticalNodeCount = (uint32_t)clothCreateInfo->verticalNodeCount;
|
cloth->verticalNodeCount = (uint32_t)clothCreateInfo->verticalNodeCount;
|
||||||
|
|
||||||
cloth->nodes = malloc(sizeof(Silkworm_Node**) * cloth->horizontalNodeCount);
|
cloth->nodes = Silkworm_malloc(sizeof(Silkworm_Node**) * cloth->horizontalNodeCount);
|
||||||
|
|
||||||
uint64_t id;
|
uint64_t id;
|
||||||
|
|
||||||
|
@ -884,7 +898,7 @@ void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo)
|
||||||
{
|
{
|
||||||
id = context->clothCount;
|
id = context->clothCount;
|
||||||
|
|
||||||
context->cloths = realloc(context->cloths, sizeof(Silkworm_Cloth*) * (context->clothCount + 1));
|
context->cloths = Silkworm_realloc(context->cloths, sizeof(Silkworm_Cloth*) * (context->clothCount + 1));
|
||||||
context->cloths[id] = cloth;
|
context->cloths[id] = cloth;
|
||||||
context->clothCount += 1;
|
context->clothCount += 1;
|
||||||
}
|
}
|
||||||
|
@ -905,7 +919,7 @@ void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo)
|
||||||
|
|
||||||
for (i = 0; i < cloth->horizontalNodeCount; i += 1)
|
for (i = 0; i < cloth->horizontalNodeCount; i += 1)
|
||||||
{
|
{
|
||||||
cloth->nodes[i] = malloc(sizeof(Silkworm_Node*) * cloth->verticalNodeCount);
|
cloth->nodes[i] = Silkworm_malloc(sizeof(Silkworm_Node*) * cloth->verticalNodeCount);
|
||||||
|
|
||||||
for (j = 0; j < cloth->verticalNodeCount; j += 1)
|
for (j = 0; j < cloth->verticalNodeCount; j += 1)
|
||||||
{
|
{
|
||||||
|
@ -931,7 +945,7 @@ void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cloth->triangles = malloc(sizeof(Silkworm_Triangle*) * cloth->horizontalNodeCount * cloth->verticalNodeCount * 2);
|
cloth->triangles = Silkworm_malloc(sizeof(Silkworm_Triangle*) * cloth->horizontalNodeCount * cloth->verticalNodeCount * 2);
|
||||||
uint32_t triangleIndex = 0;
|
uint32_t triangleIndex = 0;
|
||||||
|
|
||||||
for (i = 0; i < cloth->horizontalNodeCount; i += 1)
|
for (i = 0; i < cloth->horizontalNodeCount; i += 1)
|
||||||
|
@ -940,7 +954,7 @@ void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo)
|
||||||
{
|
{
|
||||||
if (i + 1 < cloth->horizontalNodeCount && j + 1 < cloth->verticalNodeCount)
|
if (i + 1 < cloth->horizontalNodeCount && j + 1 < cloth->verticalNodeCount)
|
||||||
{
|
{
|
||||||
cloth->triangles[triangleIndex] = malloc(sizeof(Silkworm_Triangle));
|
cloth->triangles[triangleIndex] = Silkworm_malloc(sizeof(Silkworm_Triangle));
|
||||||
|
|
||||||
cloth->triangles[triangleIndex]->a = cloth->nodes[i][j];
|
cloth->triangles[triangleIndex]->a = cloth->nodes[i][j];
|
||||||
cloth->triangles[triangleIndex]->b = cloth->nodes[i + 1][j];
|
cloth->triangles[triangleIndex]->b = cloth->nodes[i + 1][j];
|
||||||
|
@ -965,7 +979,7 @@ void* Silkworm_ClothCreate(Silkworm_ClothCreateInfo* clothCreateInfo)
|
||||||
|
|
||||||
if (i - 1 >= 0 && j - 1 >= 0)
|
if (i - 1 >= 0 && j - 1 >= 0)
|
||||||
{
|
{
|
||||||
cloth->triangles[triangleIndex] = malloc(sizeof(Silkworm_Triangle));
|
cloth->triangles[triangleIndex] = Silkworm_malloc(sizeof(Silkworm_Triangle));
|
||||||
|
|
||||||
cloth->triangles[triangleIndex]->a = cloth->nodes[i][j];
|
cloth->triangles[triangleIndex]->a = cloth->nodes[i][j];
|
||||||
cloth->triangles[triangleIndex]->b = cloth->nodes[i - 1][j];
|
cloth->triangles[triangleIndex]->b = cloth->nodes[i - 1][j];
|
||||||
|
@ -1069,7 +1083,7 @@ uint32_t Silkworm_ClothRender(void **pVertexBuffer, uint32_t *pVertexBufferLengt
|
||||||
if (vertexCount + (cloth->triangleCount * 3) > context->vertexCapacity)
|
if (vertexCount + (cloth->triangleCount * 3) > context->vertexCapacity)
|
||||||
{
|
{
|
||||||
context->vertexCapacity *= 2;
|
context->vertexCapacity *= 2;
|
||||||
context->vertexBuffer = realloc(context->vertexBuffer, sizeof(Silkworm_Vertex) * context->vertexCapacity);
|
context->vertexBuffer = Silkworm_realloc(context->vertexBuffer, sizeof(Silkworm_Vertex) * context->vertexCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < cloth->triangleCount; i += 1)
|
for (i = 0; i < cloth->triangleCount; i += 1)
|
||||||
|
@ -1155,8 +1169,8 @@ void Silkworm_PushNodesInRadius(float x, float y, float radius, float xDirection
|
||||||
|
|
||||||
if (node != NULL && !node->pinned)
|
if (node != NULL && !node->pinned)
|
||||||
{
|
{
|
||||||
float xDistance = (float)fabs(x - node->position.x);
|
float xDistance = (float)Silkworm_fabs(x - node->position.x);
|
||||||
float yDistance = (float)fabs(y - node->position.y);
|
float yDistance = (float)Silkworm_fabs(y - node->position.y);
|
||||||
|
|
||||||
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
||||||
|
|
||||||
|
@ -1181,8 +1195,8 @@ void Silkworm_PinNodesInRadius(float x, float y, float radius)
|
||||||
|
|
||||||
if (node != NULL)
|
if (node != NULL)
|
||||||
{
|
{
|
||||||
float xDistance = (float)fabs((float)x - node->position.x);
|
float xDistance = (float)Silkworm_fabs((float)x - node->position.x);
|
||||||
float yDistance = (float)fabs((float)y - node->position.y);
|
float yDistance = (float)Silkworm_fabs((float)y - node->position.y);
|
||||||
|
|
||||||
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
||||||
|
|
||||||
|
@ -1206,8 +1220,8 @@ void Silkworm_UnpinNodesInRadius(float x, float y, float radius)
|
||||||
|
|
||||||
if (node != NULL)
|
if (node != NULL)
|
||||||
{
|
{
|
||||||
float xDistance = (float)fabs((float)x - node->position.x);
|
float xDistance = (float)Silkworm_fabs((float)x - node->position.x);
|
||||||
float yDistance = (float)fabs((float)y - node->position.y);
|
float yDistance = (float)Silkworm_fabs((float)y - node->position.y);
|
||||||
|
|
||||||
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
||||||
|
|
||||||
|
@ -1231,8 +1245,8 @@ void Silkworm_DestroyNodesInRadius(float x, float y, float radius)
|
||||||
|
|
||||||
if (node != NULL && node->destroyable)
|
if (node != NULL && node->destroyable)
|
||||||
{
|
{
|
||||||
float xDistance = (float)fabs(x - node->position.x);
|
float xDistance = (float)Silkworm_fabs(x - node->position.x);
|
||||||
float yDistance = (float)fabs(y - node->position.y);
|
float yDistance = (float)Silkworm_fabs(y - node->position.y);
|
||||||
|
|
||||||
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
||||||
|
|
||||||
|
@ -1243,7 +1257,7 @@ void Silkworm_DestroyNodesInRadius(float x, float y, float radius)
|
||||||
if (context->nodeDestructionDataCount >= context->nodeDestructionDataCapacity)
|
if (context->nodeDestructionDataCount >= context->nodeDestructionDataCapacity)
|
||||||
{
|
{
|
||||||
context->nodeDestructionDataCapacity *= 2;
|
context->nodeDestructionDataCapacity *= 2;
|
||||||
context->nodeDestructionData = realloc(context->nodeDestructionData, sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
context->nodeDestructionData = Silkworm_realloc(context->nodeDestructionData, sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1279,7 +1293,7 @@ void Silkworm_DestroyNodesInRectangle(Silkworm_Rectangle* rectangle)
|
||||||
if (context->nodeDestructionDataCount >= context->nodeDestructionDataCapacity)
|
if (context->nodeDestructionDataCount >= context->nodeDestructionDataCapacity)
|
||||||
{
|
{
|
||||||
context->nodeDestructionDataCapacity *= 2;
|
context->nodeDestructionDataCapacity *= 2;
|
||||||
context->nodeDestructionData = realloc(context->nodeDestructionData, sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
context->nodeDestructionData = Silkworm_realloc(context->nodeDestructionData, sizeof(Silkworm_Vector2) * context->nodeDestructionDataCapacity);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1302,8 +1316,8 @@ void* Silkworm_FindClothInRadius(float x, float y, float radius)
|
||||||
|
|
||||||
if (node != NULL)
|
if (node != NULL)
|
||||||
{
|
{
|
||||||
float xDistance = (float)fabs(x - node->position.x);
|
float xDistance = (float)Silkworm_fabs(x - node->position.x);
|
||||||
float yDistance = (float)fabs(y - node->position.y);
|
float yDistance = (float)Silkworm_fabs(y - node->position.y);
|
||||||
|
|
||||||
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
float squareDistance = xDistance * xDistance + yDistance * yDistance;
|
||||||
|
|
||||||
|
@ -1343,19 +1357,19 @@ void Silkworm_Finish()
|
||||||
{
|
{
|
||||||
Silkworm_ClearAll();
|
Silkworm_ClearAll();
|
||||||
|
|
||||||
free(context->nodes);
|
Silkworm_free(context->nodes);
|
||||||
free(context->links);
|
Silkworm_free(context->links);
|
||||||
free(context->cloths);
|
Silkworm_free(context->cloths);
|
||||||
|
|
||||||
free(context->nodeIndexStack);
|
Silkworm_free(context->nodeIndexStack);
|
||||||
free(context->linkIndexStack);
|
Silkworm_free(context->linkIndexStack);
|
||||||
free(context->clothIndexStack);
|
Silkworm_free(context->clothIndexStack);
|
||||||
|
|
||||||
free(context->nodeDestructionData);
|
Silkworm_free(context->nodeDestructionData);
|
||||||
free(context->linkDestructionData);
|
Silkworm_free(context->linkDestructionData);
|
||||||
|
|
||||||
free(context->vertexBuffer);
|
Silkworm_free(context->vertexBuffer);
|
||||||
|
|
||||||
free(context);
|
Silkworm_free(context);
|
||||||
context = NULL;
|
context = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,9 +59,13 @@
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\SDL2\include;</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_WINDLL;USE_SDL2;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
|
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">SDL2.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\SDL2\lib\$(PlatformShortName);</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||||
|
@ -70,10 +74,14 @@
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_WINDLL;USE_SDL2;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\SDL2\include;</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|x64'">SDL2.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\SDL2\lib\$(PlatformShortName);</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
Loading…
Reference in New Issue