Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

thi-ng/c-thing

Repository files navigation

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

Name Role Website
Karsten Schmidt initiator & principal developer thi.ng

License

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

AltStyle によって変換されたページ (->オリジナル) /