Skip to content

Latest commit

 

History

History
414 lines (312 loc) · 11.5 KB

README.org

File metadata and controls

414 lines (312 loc) · 11.5 KB

c.thi.ng

Contents

Overview

WIP

Data structures

Memory management

Math

Simulation

Geometry

TBD

Requirements

Dependencies

The library itself has no 3rd party dependencies. Some of the examples however use these additional libs:

Examples

Build all examples

git clone --recursive https://github.com/thi-ng/c-thing

premake5 gmake
make config=release_sse

1D/2D Cellular automata

Source (1D) | Source (2D)

./assets/ca1d.png

# 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

Convex Hull

Source

./assets/chull.png

# build library & example app
make config=release_sse ex-chull && bin/release/ex-chull > assets/chull.svg

Diffusion-Limited Aggregation

Source

./assets/dla.png

./assets/dla-color.png

# build library & example app
make config=release_sse ex-dla && bin/release/ex-dla > assets/dla.svg

GLFW (desktop & emscripten)

Source | Online demo

./assets/glfw01.jpg

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

Poisson disc sampling image conversion

Source

./assets/iris-poisson.png

# 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

Polygon clipping (Greiner-Hormann)

Source

./assets/polyclip.png

# build library & example app
make config=release_sse ex-polyclip && bin/release/ex-polyclip > polyclip.svg

Polygon offsetting

Source

./assets/polyoffset-all-small.png

# build library & example app
make config=release_sse ex-polyclip && bin/release/ex-polyoffset > polyoffset.svg

Verlet physics

Source | Video example 1 | Video example 2

./assets/verlet.png

# 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

Voronoi

Source

./assets/poisson-voronoi.png

# build library & example app
make config=release_sse ex-voronoi && bin/release/ex-voronoi

Piping in points from external process

./assets/iris-voronoi.png

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

Build & test

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

Build static library

make config=debug_sse lib
# or
make config=release_sse lib

Build source x-ref

brew install cscope

./browse

Disassemble & list symbols

# 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_

Compile with emscripten

Build as library for emcc

Also see GLFW example for further details…

# build LLVM bitcode version for future linking with other sources
./compile-bc

Run test suite in browser

# 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()

Build customization

This project utilizes feature macros defined in the thi.ng/ct-head project. Please see documentation there for further reference to customize behavior.

Contributors

NameRoleWebsite
Karsten Schmidtinitiator & principal developerthi.ng

License

This project is open source and licensed under the Apache Software License 2.0.