30 std::vector<std::pair<int, int>> ranges;
37 for (
int i = 0;
i <
node->numChildren();
i++)
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;
79 for (
int i = 1;
i <
node->numChildren();
i++)
96 for (
int k = 2;
k <
num;
k++)
97 val += args.
inFp<1>(
k)[0];
99 for (
int k = 0;
k < 3;
k++)
128 for (
int i = 1;
i <
node->numChildren();
i++)
145 for (
int k = 1;
k <
num;
k++)
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;
235 auto i = vars.find(name);
240 auto i = vecvars.find(name);
241 if (
i != vecvars.end())
250 return std::max(0., std::min(255., x));
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>();
272 size_t width = std::strtoul(
argv[2],
nullptr, 10);
273 size_t height = std::strtoul(
argv[3],
nullptr, 10);
275 std::cerr <<
"invalid width/height" << std::endl;
281 std::cerr <<
"Cannot read file " <<
exprFile << std::endl;
284 std::string
exprStr((std::istreambuf_iterator<char>(
istream)), std::istreambuf_iterator<char>());
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;
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++) {
342 const double *
result = expr.evalFP();
354 std::cerr <<
"Writing image..." <<
imageFile << std::endl;
355 std::unique_ptr<std::FILE,
decltype(&std::fclose)> fp {
fopen(
imageFile,
"wb"), &std::fclose};
Node that calls a function.
Vec< double, d, true > inFp(int i)
virtual void eval(ArgHandle args)=0
ExprType prep(ExprFuncNode *node, bool scalarWanted, ExprVarEnvBuilder &envBuilder) const override=0
virtual ExprFuncNode::Data * evalConstant(const ExprFuncNode *node, ArgHandle args) const =0
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)
ExprType & FP(int d)
Mutate this into a floating point type of dimension d.
ExprType & Varying()
Mutate this into a varying lifetime.
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
virtual ExprVarRef * resolveVar(const std::string &) const
ExprFuncNode::Data * evalConstant(const ExprFuncNode *, ArgHandle) const override
MapFuncX & operator=(const MapFuncX &)=default
void eval(ArgHandle args) override
ExprType prep(ExprFuncNode *node, bool, ExprVarEnvBuilder &envBuilder) const override
MapFuncX(const MapFuncX &)=default
MapFuncX & operator=(MapFuncX &&)=default
MapFuncX(MapFuncX &&)=default
~MapFuncX() override=default
ExprFuncNode::Data * evalConstant(const ExprFuncNode *, ArgHandle) const override
TriplanarFuncX(const TriplanarFuncX &)=default
~TriplanarFuncX() override=default
TriplanarFuncX & operator=(const TriplanarFuncX &)=default
ExprType prep(ExprFuncNode *node, bool, ExprVarEnvBuilder &envBuilder) const override
void eval(ArgHandle args) override
TriplanarFuncX(TriplanarFuncX &&)=default
TriplanarFuncX & operator=(TriplanarFuncX &&)=default
int main(int argc, char *argv[])
static const char * triplanar_docstring
static const char * map_docstring
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