Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
aa91280
Create new cli project with CMakeLists.txt
j-beyer Nov 20, 2017
cbe7187
Merge branch 'master' into cli-tool
j-beyer Nov 20, 2017
e3b3391
Add basic command line flag handling using cppassist/cmdline
j-beyer Nov 20, 2017
c2f92a5
Merge branch 'fix-openmp-check' into cli-tool
Nov 27, 2017
56b626a
Fix indentation in main.cpp
j-beyer Nov 27, 2017
729a8c9
Require cppexpose dependency
j-beyer Nov 27, 2017
5eed0a2
Rewrite CLI using cppassist::CommandLineProgram
j-beyer Dec 4, 2017
b56cc35
Remove unused import, add version
j-beyer Dec 4, 2017
0905f9f
Use switch instead of different actions
j-beyer Dec 4, 2017
f34a3b2
Merge pull request #11 from p-otto/cli-commandlineprogram
Dec 4, 2017
4bc9d15
Merge branch 'cli-tool' into json-export
j-beyer Dec 4, 2017
e26abe5
Start basic scripting
Dec 4, 2017
e7a8b5d
Merge branch 'cli-tool' of https://github.com/p-otto/glkernel into cl…
Dec 4, 2017
0fd5e2f
Remove old code
Dec 4, 2017
b8f51a7
Implement conversion between kernel and variant to enable javascript …
Dec 4, 2017
45bfa23
Incorporate change ideas from #1
j-beyer Dec 11, 2017
bcd44d3
Extract methods for readability
j-beyer Dec 11, 2017
c412093
WIP new scripting interface
Dec 12, 2017
8f89211
Merge pull request #23 from p-otto/22-cli-api-changes
Jan 8, 2018
a11f8ee
Merge branch 'cli-tool' into json-export
j-beyer Jan 8, 2018
720aaa6
Add KernelGenerator and KernelExporter for kernel generation from jav…
j-beyer Jan 8, 2018
4cd1171
Add --force switch and abort if output file exists and --force is not…
j-beyer Jan 8, 2018
168a537
Add comment explaining empty short name
j-beyer Jan 8, 2018
29dfae8
Incorporate review feedback
j-beyer Jan 8, 2018
d10baa9
Merge pull request #24 from p-otto/13-no-files-overridden
j-beyer Jan 8, 2018
261d897
Merge branch 'cli-tool' into json-export
j-beyer Jan 8, 2018
003c909
Remove force parameter from exporter - is handled before now
j-beyer Jan 8, 2018
12ce279
WIP: Expose glkernel operations to JavaScript
Jan 8, 2018
0cfba92
Further WIP on exposure
Jan 9, 2018
bf06020
Rewrite kernel json export - unwrap kernel variant, and append values…
j-beyer Jan 10, 2018
c1e4b27
Use initializer_list instead of variadic arguments in appendFloatValues
j-beyer Jan 11, 2018
3af2bcc
Rewrite KernelJsonExporter using tkernel cell templates
j-beyer Jan 13, 2018
707eab2
Undo automatic renaming mistake
j-beyer Jan 13, 2018
0afff00
Merge pull request #31 from p-otto/json-export
Jan 13, 2018
2bb5f90
Merge branch 'cli-tool' into scripting
j-beyer Jan 13, 2018
898c220
Connect scripting and json export in first example
j-beyer Jan 13, 2018
1933908
Add createKernel{2,3,4}
Jan 13, 2018
4118ad1
Use kernel2 and different dimensions to test them
Jan 13, 2018
57d2aca
Remove debugging print, return variants in scripting
j-beyer Jan 15, 2018
4c309bb
Rename KernelExporter, fix comma in description, remove export folder…
j-beyer Jan 15, 2018
4eb2e29
Replace hardcoded script with loaded script from js file
Jan 15, 2018
b75b9cb
Add beautify switch, adapt stringify method
j-beyer Jan 15, 2018
92196cb
WIP: Code generation
Jan 15, 2018
93674a0
Merge pull request #37 from p-otto/35-beautify-switch
Jan 22, 2018
4df1b3d
Merge commit '93674a0c4c299ad67d741c6c5157e698994a394a' into scripting
Jan 22, 2018
23997ce
First png implementation, rename JsonKernel, cleanup
j-beyer Jan 22, 2018
469e364
Implement C++ code generation
Jan 29, 2018
f2e49a8
Merge branch 'scripting' of https://github.com/p-otto/glkernel into s…
Jan 29, 2018
6fea9d9
Add missing files for C++ code generation
Jan 29, 2018
3ffb5f7
Refactor generation code
Feb 5, 2018
a182142
Remove misplaced comment confusing generator
Feb 5, 2018
c5dd13a
Add source & destination directories to generator
Feb 5, 2018
f9f6366
Add custom build target for generation
Feb 5, 2018
cc671c6
Prepare KernelGenerator to make use of generated files
j-beyer Feb 5, 2018
c622cf7
Refactor png export to resolve some TODOs
j-beyer Feb 5, 2018
892d516
Add JSON importer
Feb 5, 2018
f5d2094
Add helper function to find global min and max in kernel, independent…
j-beyer Feb 5, 2018
69d9bf6
Use correct png api for 16 bit depth
j-beyer Feb 5, 2018
d09ab07
Add todo comment
j-beyer Feb 5, 2018
599da34
Change generated file locations
j-beyer Feb 5, 2018
5d081f6
Minor cleanup
j-beyer Feb 12, 2018
1779431
Merge branch 'cli-tool' into 18-png-export
j-beyer Feb 12, 2018
c1cdf47
Restrict template instanciations
Feb 12, 2018
7ff8519
Add cleanup upon failure in png generation
j-beyer Feb 12, 2018
6e62980
Implement JSON importer
Feb 12, 2018
c829385
More checks for JSONImporter
Feb 12, 2018
a51a56f
Add issue links to open todos
j-beyer Feb 12, 2018
db16088
Assert that all cells have same type for vec[2,3,4]
Feb 12, 2018
cb3c214
Remove completed todo
Feb 12, 2018
1ce11cb
Enumerate conflicting overloads in generation
Feb 12, 2018
84ab21b
Merge branch 'restrict_template_instanciations' into scripting
Feb 12, 2018
d003093
Incorporate review of #45
j-beyer Feb 12, 2018
778c4b1
Replace error checks woth custom assert
Feb 12, 2018
6d9c6c9
Merge pull request #45 from p-otto/18-png-export
Feb 12, 2018
828f877
Merge commit '6d9c6c9f9f7c6243ffac9b81c9a22fffa2c39563' into json_import
Feb 12, 2018
5b8d401
Merge branch 'master' into cli-tool
Feb 12, 2018
71b80d5
Merge branch 'cli-tool' into json_import
Feb 12, 2018
175a6ef
Merge branch 'cli-tool' of https://github.com/p-otto/glkernel into cl…
Feb 12, 2018
8deb4fa
Merge branch 'cli-tool' into json_import
Feb 12, 2018
eb00bd0
Re-add KernelObject to build
Feb 12, 2018
05cf7f7
Update code after merge, rename to JsonImporter, add pragma once wher…
Feb 12, 2018
84ec649
Merge pull request #46 from p-otto/json_import
j-beyer Feb 12, 2018
31d1202
Merge branch 'cli-tool' into scripting
Feb 12, 2018
c493047
Fix template error and check in generated files
Feb 12, 2018
860a104
Remove obsolete files
Feb 12, 2018
8debeba
Add warning to generated files
Feb 12, 2018
38cb4fe
Remove repeated default arguments
Feb 12, 2018
5e6c74f
Make generate.py compatible with Python 2
Feb 16, 2018
3a7d17d
Throw if glkernel.js or input js file could not be located
Feb 22, 2018
cd19c8f
Move glkernel.js to data folder
Feb 22, 2018
0fcad02
Merge pull request #41 from p-otto/scripting
Feb 22, 2018
b9076d6
Return kernel object in every js function call to remove need to retu…
Feb 22, 2018
95e311b
Cleanup helper.h by moving some functionality for PNGExporter and mov…
Feb 22, 2018
3bae4ee
Remove unnecessary template
Feb 22, 2018
9d3d5df
Remove duplication between JSInterface and JsonImporter
Feb 22, 2018
943bc46
Add cli-tool to readme
j-beyer Feb 22, 2018
382ed2c
Add $ to bash commands, highlight TODO
j-beyer Feb 22, 2018
53d774e
Merge pull request #55 from p-otto/cleanup_helper
j-beyer Feb 22, 2018
56c3bfb
Merge pull request #54 from p-otto/return_kernel_object
j-beyer Feb 22, 2018
d1c2586
Write generated .js to different directory
Feb 26, 2018
b12f123
Change how #includes are generated
Feb 26, 2018
8b574f4
Ease renaming generate target
Feb 26, 2018
502b8ec
Merge pull request #57 from p-otto/43-update-readme
Feb 26, 2018
7386f5f
Merge branch 'master' into cli-tool
Feb 26, 2018
397a73e
Fix compiler warning
Feb 26, 2018
23908a4
Fix formatting in helper
Feb 26, 2018
c49e096
Re-enable chaining in user JS code
Feb 26, 2018
84833e3
Use cppassist for extension detection
Feb 26, 2018
49ec53c
Use range based for loop
Feb 26, 2018
4e9ed09
Allow range based for loop for const kernels
Feb 26, 2018
badae3d
Adressing review comments
Feb 26, 2018
59e52b1
Merge remote-tracking branch 'origin/restrict_template_instanciations…
Mar 5, 2018
74c23fa
Generator: change to cppassist::error()
Mar 14, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,100 @@ ToDo

ToDo

## Tools

### glkernel-cli

The glkernel-cli tool provides a convenient way to generate and manipulate kernels using the command line.
The usage is as follows:

```
glkernel-cli [--force] [--beautify] [--output <outputFileName>] [--format <outputFileFormat>] <inputFileName>

Options:
-b, --beautify Beautify the output (only applies to json output format)
--force Override the output file, if it exists
-f, --format File format for the generated / converted kernel (e.g., json, png, h)
-o, --output File that the generated / converted kernel will be written to (defaults: <inputFileName>.json for generation, <inputFileName>.png for conversion)
```

- The default output format for kernel generation is JSON
- The default output format for kernel conversion is PNG
- If not output file name is given, the output file name will be deduced from the input file name (here, it would be `kernel.json`)
- If no output format is given, the output format will be deduced from the output file name (explicitly given or deduced)

#### Generating a kernel using JavaScript

Kernels can be generated from JavaScript by simply passing a `.js` file as input to the command line tool.
Examples:

```
$ glkernel-cli kernel.js

$ glkernel-cli kernel.js -o random_noise_kernel.json --force --beautify

$ glkernel-cli kernel.js -o sorted_kernel -f png
```

A JavaScript interface (`JSInterface.h`, `JSInterface.cpp`, `glkernel.js`) allows calling glkernel functionality from user scripts.
It is included in the tool's sources (C++ files), and in the `data/` directory (JavaScript file).
The interface is automatically generated from the existing glkernel API.

__If you extend or change the glkernel API, please [re-generate the JavaScript interface](#generating-the-javascript-interface)!__

##### Writing kernel generation instructions in JavaScript

While the glkernel library uses free functions, the JavaScript API provides manipulation of kernels via object methods on kernel objects.
The API method names are taken from the library.

The following script shows the usage of the JavaScript API by example (it can be found in `scripts/kernel.js`):

```javascript
// create new Kernel2 object (i.e., a 3D kernel of dimensions 10x5x2, holding vec2's as values
var kernel = new Kernel2(10, 5, 2);

// translates to glkernel::sequence::uniform(kernel, 0.0, 1.0)
kernel.sequence.uniform(0.0, 1.0);

// examples for other kernel methods
kernel.shuffle.random();
kernel.scale.range(-1.0, 1.0);

// glkernel::sort::distance for a Kernel2 requires a vec2 as parameter
// vec parameters can be passed as JavaScript arrays
kernel.sort.distance([0.0, 0.0]);
```

#### Converting an existing kernel

After generating a kernel in JSON format, that kernel can be read by the tool to be converted into another representation (e.g., PNG).
This is achieved by simply passing a `.json` file as input to the command line tool.
Examples:

```
$ glkernel-cli kernel.json

$ glkernel-cli kernel.json -o sorted_kernel -f png --force
```

If no output file or format is given, the default output format is PNG.

#### Generating the JavaScript interface

The JavaScript interface files can simply be re-generated using the CMake `generate` target, either from your IDE, or from the project's root folder using the following CMake command:

```
$ cmake --build ./build --target generate
```

This requires Python 2 or 3 to be installed on the system.
Alternatively, the Python script can be executed manually (also from the root folder):

__TODO__: update this if the destination of JS and C++ files are different
```
$ python scripts/generate.py -t scripts/templates -d source/tools/glkernel-cli
```

##### glkernel-cmd

Additionally to using glkernel as a library, there is a standalone command line tool to generate kernels from JSON descriptions.
Expand Down
192 changes: 192 additions & 0 deletions data/glkernel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@

// THIS IS A GENERATED FILE!
// DO NOT EDIT

GradientNoiseType = {
Perlin: 0,
Simplex: 1
};

HemisphereMapping = {
Uniform: 0,
Cosine: 1
};

OctaveType = {
Standard: 0,
Cloud: 1,
CloudAbs: 2,
Wood: 3,
Paper: 4
};

var _Kernel = function(x,y,z) {
this._initialize = function(x,y,z) {
var that = this;

this.kernel = this.generateKernel(x,y,z);

this.noise = {
uniform: function(range_min, range_max) {
_glkernel.noise_uniform(that.kernel, range_min, range_max);
return that;
},
normal: function(mean, stddev) {
_glkernel.noise_normal(that.kernel, mean, stddev);
return that;
},
gradient: function(noise_type, octave_type, startFrequency, octaves) {
// Defaults
noise_type = (typeof noise_type !== 'undefined') ? noise_type : GradientNoiseType.Perlin;
octave_type = (typeof octave_type !== 'undefined') ? octave_type : OctaveType.Standard;
startFrequency = (typeof startFrequency !== 'undefined') ? startFrequency : 3;
octaves = (typeof octaves !== 'undefined') ? octaves : 5;

_glkernel.noise_gradient(that.kernel, noise_type, octave_type, startFrequency, octaves);
return that;
}
};
this.sample = {
poisson_square: function(num_probes) {
// Defaults
num_probes = (typeof num_probes !== 'undefined') ? num_probes : 32;

_glkernel.sample_poisson_square(that.kernel, num_probes);
return that;
},
poisson_square: function(min_dist, num_probes) {
// Defaults
num_probes = (typeof num_probes !== 'undefined') ? num_probes : 32;

_glkernel.sample_poisson_square1(that.kernel, min_dist, num_probes);
return that;
},
stratified: function() {
_glkernel.sample_stratified(that.kernel);
return that;
},
hammersley: function() {
_glkernel.sample_hammersley(that.kernel);
return that;
},
halton: function(base1, base2) {
_glkernel.sample_halton(that.kernel, base1, base2);
return that;
},
hammersley_sphere: function(type) {
// Defaults
type = (typeof type !== 'undefined') ? type : HemisphereMapping.Uniform;

_glkernel.sample_hammersley_sphere(that.kernel, type);
return that;
},
halton_sphere: function(base1, base2, type) {
// Defaults
type = (typeof type !== 'undefined') ? type : HemisphereMapping.Uniform;

_glkernel.sample_halton_sphere(that.kernel, base1, base2, type);
return that;
},
best_candidate: function(num_candidates) {
// Defaults
num_candidates = (typeof num_candidates !== 'undefined') ? num_candidates : 32;

_glkernel.sample_best_candidate(that.kernel, num_candidates);
return that;
},
n_rooks: function() {
_glkernel.sample_n_rooks(that.kernel);
return that;
},
multi_jittered: function(correlated) {
// Defaults
correlated = (typeof correlated !== 'undefined') ? correlated : false;

_glkernel.sample_multi_jittered(that.kernel, correlated);
return that;
},
golden_point_set: function() {
_glkernel.sample_golden_point_set(that.kernel);
return that;
}
};
this.scale = {
range: function(rangeToLower, rangeToUpper, rangeFromLower, rangeFromUpper) {
// Defaults
rangeFromLower = (typeof rangeFromLower !== 'undefined') ? rangeFromLower : 0;
rangeFromUpper = (typeof rangeFromUpper !== 'undefined') ? rangeFromUpper : 1;

_glkernel.scale_range(that.kernel, rangeToLower, rangeToUpper, rangeFromLower, rangeFromUpper);
return that;
}
};
this.sequence = {
uniform: function(range_min, range_max) {
_glkernel.sequence_uniform(that.kernel, range_min, range_max);
return that;
}
};
this.shuffle = {
bucket_permutate: function(subkernel_width, subkernel_height, subkernel_depth, permutate_per_bucket) {
// Defaults
subkernel_width = (typeof subkernel_width !== 'undefined') ? subkernel_width : 1;
subkernel_height = (typeof subkernel_height !== 'undefined') ? subkernel_height : 1;
subkernel_depth = (typeof subkernel_depth !== 'undefined') ? subkernel_depth : 1;
permutate_per_bucket = (typeof permutate_per_bucket !== 'undefined') ? permutate_per_bucket : false;

_glkernel.shuffle_bucket_permutate(that.kernel, subkernel_width, subkernel_height, subkernel_depth, permutate_per_bucket);
return that;
},
bayer: function() {
_glkernel.shuffle_bayer(that.kernel);
return that;
},
random: function(start) {
// Defaults
start = (typeof start !== 'undefined') ? start : 1;

_glkernel.shuffle_random(that.kernel, start);
return that;
}
};
this.sort = {
distance: function(origin) {
_glkernel.sort_distance(that.kernel, origin);
return that;
}
};
};
};

var Kernel1 = function(x,y,z) {
this.generateKernel = function(x,y,z) {
return _glkernel.createKernel1(x,y,z);
}
this._initialize(x,y,z);
};

var Kernel2 = function(x,y,z) {
this.generateKernel = function(x,y,z) {
return _glkernel.createKernel2(x,y,z);
}
this._initialize(x,y,z);
};

var Kernel3 = function(x,y,z) {
this.generateKernel = function(x,y,z) {
return _glkernel.createKernel3(x,y,z);
}
this._initialize(x,y,z);
};

var Kernel4 = function(x,y,z) {
this.generateKernel = function(x,y,z) {
return _glkernel.createKernel4(x,y,z);
}
this._initialize(x,y,z);
};

Kernel1.prototype = new _Kernel;
Kernel2.prototype = new _Kernel;
Kernel3.prototype = new _Kernel;
Kernel4.prototype = new _Kernel;
Loading