30 std::vector<std::pair<int, int>> ranges;
47 void eval(ArgHandle args)
override
49 if (args.nargs() >= 2) {
50 args.outFp = (args.inFp<1>(0)[0] - args.inFp<1>(1)[0]) / 2.0;
60 ~ImageSynthRandFuncX()
override =
default;
61 ImageSynthRandFuncX &
operator=(ImageSynthRandFuncX &&) =
default;
62 ImageSynthRandFuncX &
operator=(
const ImageSynthRandFuncX &) =
default;
63 ImageSynthRandFuncX(ImageSynthRandFuncX &&) =
default;
64 ImageSynthRandFuncX(
const ImageSynthRandFuncX &) =
default;
71 std::vector<std::pair<int, int>>
ranges;
91 double *out = &args.
outFp;
94 int num = args.
nargs();
96 for (
int k = 2; k < num; k++)
97 val += args.
inFp<1>(k)[0];
99 for (
int k = 0; k < 3; k++)
140 double *out = &args.
outFp;
143 int num = args.
nargs();
145 for (
int k = 1; k < num; k++)
146 val += (args.
inFp<3>(k)[0] + args.
inFp<3>(k)[1] + args.
inFp<3>(k)[2]);
148 for (
int k = 0; k < 3; k++)
177 ImageSynthExpr(
const std::string &expr)
184 Var(
const double val)
196 void eval(
double *result)
override
201 void eval(
const char **)
override
216 void eval(
double *result)
override
218 for (
int k = 0; k < 3; k++)
222 void eval(
const char **)
override
228 mutable std::map<std::string, Var> vars;
229 mutable std::map<std::string, VecVar> vecvars;
232 ExprVarRef *resolveVar(
const std::string &name)
const override
235 auto i = vars.find(name);
240 auto i = vecvars.find(name);
241 if (i != vecvars.end())
253 int main(
int argc,
char *argv[])
256 std::cerr <<
"Usage: " << argv[0] <<
" <image file> <width> <height> <exprFile>" << std::endl;
260 auto imageSynthRand = std::make_unique<KSeExpr::ImageSynthRandFuncX>();
261 auto map = std::make_unique<KSeExpr::MapFuncX>();
262 auto triplanar = std::make_unique<KSeExpr::TriplanarFuncX>();
270 const char *imageFile = argv[1];
271 const char *exprFile = argv[4];
272 size_t width = std::strtoul(argv[2],
nullptr, 10);
273 size_t height = std::strtoul(argv[3],
nullptr, 10);
274 if (!width || !height) {
275 std::cerr <<
"invalid width/height" << std::endl;
279 std::ifstream istream(exprFile);
281 std::cerr <<
"Cannot read file " << exprFile << std::endl;
284 std::string exprStr((std::istreambuf_iterator<char>(istream)), std::istreambuf_iterator<char>());
285 ImageSynthExpr expr(exprStr);
288 expr.vars[
"u"] = ImageSynthExpr::Var(0.);
289 expr.vars[
"v"] = ImageSynthExpr::Var(0.);
290 expr.vars[
"w"] = ImageSynthExpr::Var(width);
291 expr.vars[
"h"] = ImageSynthExpr::Var(height);
293 expr.vars[
"faceId"] = ImageSynthExpr::Var(0.);
294 expr.vecvars[
"P"] = ImageSynthExpr::VecVar();
295 expr.vecvars[
"Cs"] = ImageSynthExpr::VecVar();
296 expr.vecvars[
"Ci"] = ImageSynthExpr::VecVar();
299 bool valid = expr.isValid();
301 std::cerr <<
"Invalid expression " << std::endl;
302 std::cerr << expr.parseError() << std::endl;
311 std::cerr <<
"Evaluating expression... from " << exprFile << std::endl;
312 std::vector<unsigned char> image(width * height * 4);
313 double one_over_width = 1. / width;
314 double one_over_height = 1. / height;
315 double &u = expr.vars[
"u"].val;
316 double &v = expr.vars[
"v"].val;
318 double &faceId = expr.vars[
"faceId"].val;
325 for (
size_t row {}; row < height; row++) {
326 for (
size_t col {}; col < width; col++) {
327 auto i = (row * width + col) * 4;
328 u = one_over_width * (col + .5);
329 v = one_over_height * (row + .5);
331 faceId =
floor(u * 5);
342 const double *result = expr.evalFP();
345 image[i] =
clamp(result[0] * 256.);
346 image[i + 1] =
clamp(result[1] * 256.);
347 image[i + 2] =
clamp(result[2] * 256.);
354 std::cerr <<
"Writing image..." << imageFile << std::endl;
355 std::unique_ptr<std::FILE, decltype(&std::fclose)> fp {fopen(imageFile,
"wb"), &std::fclose};
360 png_structp png_ptr {png_create_write_struct(PNG_LIBPNG_VER_STRING,
nullptr,
nullptr,
nullptr)};
361 png_infop info_ptr {png_create_info_struct(png_ptr)};
362 png_init_io(png_ptr, fp.get());
363 png_set_IHDR(png_ptr,
370 PNG_COMPRESSION_TYPE_DEFAULT,
371 PNG_FILTER_TYPE_DEFAULT);
372 std::vector<png_byte *> ptrs(height);
373 for (
size_t i {}; i < height; i++) {
374 ptrs[i] = &image[width * i * 4];
376 png_set_rows(png_ptr, info_ptr, ptrs.data());
377 png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY,
nullptr);
ExprType prep(ExprFuncNode *node, bool, ExprVarEnvBuilder &envBuilder) const override
ExprFuncNode::Data * evalConstant(const ExprFuncNode *, ArgHandle) const override
void eval(ArgHandle args) override
Node that calls a function.
bool checkArg(int argIndex, const ExprType &type, ExprVarEnvBuilder &envBuilder)
Vec< double, d, true > inFp(int i)
ExprFuncX & operator=(const ExprFuncX &)=default
Function Definition, used in parse tree and func table.
static void define(const char *name, const ExprFunc &f, const char *docString)
int numChildren() const
Number of children.
ExprType & Varying()
Mutate this into a varying lifetime.
ExprType & FP(int d)
Mutate this into a floating point type of dimension d.
ExprType & Error()
Mutate this into an error type.
Variable scope builder is used by the type checking and code gen to track visiblity of variables and ...
abstract class for implementing variable references
ExprFuncNode::Data * evalConstant(const ExprFuncNode *, ArgHandle) const override
void eval(ArgHandle args) override
ExprType prep(ExprFuncNode *node, bool, ExprVarEnvBuilder &envBuilder) const override
MapFuncX(const MapFuncX &)=default
MapFuncX & operator=(const MapFuncX &)=default
MapFuncX & operator=(MapFuncX &&)=default
MapFuncX(MapFuncX &&)=default
~MapFuncX() override=default
TriplanarFuncX(const TriplanarFuncX &)=default
~TriplanarFuncX() override=default
ExprFuncNode::Data * evalConstant(const ExprFuncNode *, ArgHandle) const override
ExprType prep(ExprFuncNode *node, bool, ExprVarEnvBuilder &envBuilder) const override
TriplanarFuncX & operator=(TriplanarFuncX &&)=default
TriplanarFuncX & operator=(const TriplanarFuncX &)=default
void eval(ArgHandle args) override
TriplanarFuncX(TriplanarFuncX &&)=default
int main(int argc, char *argv[])
static const char * rand_docstring
static const char * triplanar_docstring
static const char * map_docstring
KSeExpr_DEFAULT double_t floor(double_t val)
double max(double x, double y)
double min(double x, double y)
double clamp(double x, double lo, double hi)
static const char * rand_docstring
base class for custom instance data
std::vector< std::pair< int, int > > ranges
std::vector< std::pair< int, int > > ranges