Skip to content
/ procgen Public

A library for procedural generation with L-system-derived imperative language

License

Notifications You must be signed in to change notification settings

Romop5/procgen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

35d6e8e · May 14, 2018
May 2, 2018
Mar 30, 2018
May 14, 2018
Apr 30, 2018
Feb 19, 2018
Apr 7, 2018
Mar 23, 2018
Apr 30, 2018
Mar 18, 2018
Mar 18, 2018
Apr 21, 2018
Feb 9, 2018
Feb 9, 2018
May 2, 2018
Apr 14, 2018
Feb 19, 2018

Repository files navigation

ProcGen - a library for procedural generation

About

WORK IN PROGRESS BUG REPORTS APPRECIATED

Have you ever wanted to generate fractals ? Recursive geometry ? Complex self-similar structures ? Or simple 3D models for voxel-like game ?

ProcGen is a C++ library aimed to be used for procedural generation. It works as rewritting machine which iteratively transforms user-defined structures to other structures. This is allowed by defining custom structures like in C-like language and defining rules which act like procedures, transforming the given input structure to new structures.

The generation is thus similar to parametric stochastic OL-systems as it has rules with parameters, which are conditioned. However, both rule body and condition are defined in imperative manner, with C-like statements like if, while.

It works as a blackbox that receives a description of generation, written down in procedural language at the input and outputs generated collection of structures in fancy JSON format.

The library is a part of bachelor thesis at FIT BUT in 2018.

Example results

See

Features

  • C-like style of code
  • L-system & rewritting system based generation
  • Run-time structure and rules configuration
  • JSON serializing for results of generation
  • CMake supported
  • Python bindings (TODO)

Documentation

Changelog

Language reference

Simple generating tutorial

How does this tool and L-systems work

Complete BNF grammar

Example procedural code

Following code was used to generate the pyramide which can be found in the header of this document.

using vec3 = struct  {// define vector of 3 floats
    float x;
    float y;
    float z;
};

using cube = struct {// define cube (position + side of cube)
    vec3 position;
    float sz;
};

// the one and only rule
using tst = rule cube {
    return true;  // this rule is valid in every step, so simply return true
} {
    // the body of rule -> following statements create new symbols which
    // replace the current one in next-step string
    float newSize = this.sz/2.0;
    // Generate three base cubes
    appendSymbol(cube(vec3(this.position.x-newSize,this.position.y-newSize,this.position.z-newSize) ,newSize));
    appendSymbol(cube(vec3(this.position.x+newSize,this.position.y-newSize,this.position.z-newSize) ,newSize));
    appendSymbol(cube(vec3(this.position.x,this.position.y-newSize,this.position.z+newSize) ,newSize));
    // Generate one above them
    appendSymbol(cube(vec3(this.position.x,this.position.y+newSize,this.position.z) ,newSize));

};

// Global function which works as main() in regular c
int init() {
    appendSymbol(cCube(cVec3(0.0,0.0,0.0),50.0));
    setMaximumIterations(5);
}

Dependencies

Compilation

Special thanks to

  • Ing. Tomáš Milet - advisory/supervision

About

A library for procedural generation with L-system-derived imperative language

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages