- c.thi.ng
WIP
- Adjacency matrix (undirected graph)
- Cons list (with & without reference counting)
- Hashset (generic)
- Hashtable (generic)
- Object wrapper & protocol dispatch
- Octree
- Quadtree
- Spatial grid (1D, 2D, 3D)
- Structure of Array (SOA) wrapper & vector ops (SSE, AVX & serial)
- Memory pool (auto-growth, manual compacts)
- Reference counting utils
- Murmur Hash (32bit version)
- Poisson disc sampling
- Cellular Automata (1D/2D, w/ adjustable kernel sizes)
- Verlet physics (2D particles)
- Convex Hull (2D)
- Matrix 4x4 (w/ opt SSE impls)
- Vec2/3/4 (w/ opt SSE impls)
- Vector swizzling
- Line clipping (Liang-Barsky)
- Polygon (2D)
- Polygon clipping (Greiner-Hormann)
- Polygon offsetting / insetting
- Voronoi (2D)
...
TBD
- Premake5
- GNU Make
- GCC / Clang (w/ C11 support)
- fswatch (only needed for
./autotestrunner) - emscripten & node (only needed for asm.js x-compilation via
./compile&./compile-bc) - cscope (only needed for
./browse) - rsvg & ffmpeg (only needed for
./makevideo)
The library itself has no 3rd party dependencies. Some of the examples however use these additional libs:
git clone --recursive https://github.com/thi-ng/c-thing premake5 gmake make config=release_sse
# build library & example app make config=release_sse ex-ca1d # 1D sample invocation w/ Wolfram Rule 105 # Result will be written to /assets/ca-105.svg # args: rule states kernelwidth res bin/release/ex-ca1d 105 2 1 # Output all 255 wolfram rules for i in {1..255}; do bin/release/ex-ca1d $i 2 1 128; done # Another example w/ bigger kernel size bin/release/ex-ca1d 522530942 32 3 128 # build 2D example app make config=release_sse ex-ca2d # frames will be written to /assets bin/release/ex-ca2d
# build library & example app make config=release_sse ex-chull && bin/release/ex-chull > assets/chull.svg
# build library & example app make config=release_sse ex-dla && bin/release/ex-dla > assets/dla.svg
See dependencies for details...
# build library & example app make config=release_sse ex-glfw01 && bin/release/ex-glfw01
Note: Desktop version currently only has build settings for OSX.
To compile with Emscripten & open in browser: http://localhost:8000/glfw.html
# build LLVM bitcode of library (./obj/libcthing.bc) ./compile-bc # compile example for browser & link with lib emcc -O2 -DCT_FEATURE_LOG -DCT_NO_EXPORT -DNDEBUG \ -s 'USE_GLFW=3' \ -s 'ELIMINATE_DUPLICATE_FUNCTIONS=1' \ -s 'NO_EXIT_RUNTIME=1' \ --llvm-lto 1 \ --closure 1 \ --preload-file assets/suzanne.stl \ -Isrc -Iext \ -o glfw.html \ examples/glfw/*.c obj/libcthing.bc # launch server python -m SimpleHTTPServer
# build library & example app make config=release_sse ex-poisson # show usage bin/release/ex-poisson # Missing input file # Usage: ex-poisson [options] image [ > out.svg ] # -b HEX bg color (default: ffffff) # -f HEX fg color (default: 0000ff) # -g FLOAT gamma (default: 3.00) # -i invert (also swaps fg/bg) (default: no) # -m FLOAT min distance (default: 2.00) # -x FLOAT max distance (default: 10.00) # -r FLOAT dot radius (default: 1.00) # -q INT quality (default: 100) # -t output points as text only (default: no) # concrete example (for image size roughly 700x1000px) bin/release/ex-poisson -g 1.25 -q 500 -m 1.5 -x 16 assets/iris.jpg > assets/iris.svg
# build library & example app make config=release_sse ex-polyclip && bin/release/ex-polyclip > polyclip.svg
./assets/polyoffset-all-small.png
# build library & example app make config=release_sse ex-polyclip && bin/release/ex-polyoffset > polyoffset.svg
Source | Video example 1 | Video example 2
# build library & example app make config=release_sse ex-verlet && bin/release/ex-verlet # ouputs are stored as SVG sequence in /assets # use script below to convert to mp4 (requires rsvg & ffmpeg) -> out.mp4 ./makevideo verlet
# build library & example app make config=release_sse ex-voronoi && bin/release/ex-voronoi
The image above was generated by first sampling a JPG with the poisson example tool (configured to output points as text) and then piping these points into the voronoi example.
bin/release/ex-poisson -b 00ffff -f 0000ff -q 500 -m 2 -x 16 -t assets/iris.jpg | \ bin/release/ex-voronoi -p -w 757 -h 450 > iris-voronoi.svg
Get further help for autogenerated Makefile:
# checkout with submodules git clone --recursive https://github.com/thi-ng/c-thing # generate Makefiles premake5 gmake make help # Usage: make [config=name] [target] # CONFIGURATIONS: # debug_sse # debug_no_sse # release_sse # release_no_sse # # TARGETS: # all (default) # clean # test # test_asan # lib # ex-ca1d # ex-ca2d # ex-chull # ex-dla # ex-poisson # ex-verlet # ex-verlet-pack # ex-polyclip # ex-polyoffset # ex-voronoi # ex-glfw01
# build & run tests manually make config=debug_sse test && bin/debug/test # or make config=release_sse test && bin/release/test # ...or use auto test w/ file watcher # tests re-run automatically if files in /src or /test are changed # if no args given, compiles w/ address sanitizer enabled ./autotest # ...or provide build config (target config profile) # (only test_msan requires linux & clang, other profiles also build w/ gcc etc.) ./autotest test_msan ./autotest test_asan debug ./autotest test release no_sse
make config=debug_sse lib
# or
make config=release_sse libbrew install cscope ./browse
# display disassembly (OSX) otool -jtV bin/release/libcthing.a | less # display global symbols defined in lib nm -g -j bin/release/libcthing.a | grep --color=never _ct_
Also see GLFW example for further details...
# build LLVM bitcode version for future linking with other sources
./compile-bc# help / usage ./compile -h # Usage: # -a : separate asm.js output # -c : enable Closure compiler step # -d : remove duplicate functions # -D SYM : add define # -h : show this help # -k : enable runtime checks # -m : enable memory checks # -s : enable SSE (SIMD.js) # -t : include tests # compile with tests, closure pass & remove duplicate fns ./compile -tdc python3 -m http.server # in browser dev console - http://localhost:8000/ cthing(); cthing._main()
This project utilizes feature macros defined in the thi.ng/ct-head project. Please see documentation there for further reference to customize behavior.
This project is open source and licensed under the Apache Software License 2.0.