Skip to content

Commit 934e343

Browse files
committed
Add more script math functions
1 parent 1645e98 commit 934e343

File tree

2 files changed

+268
-0
lines changed

2 files changed

+268
-0
lines changed

distr/flecs.c

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64722,6 +64722,69 @@ double flecs_lerp(
6472264722
return a + t * (b - a);
6472364723
}
6472464724

64725+
static
64726+
double flecs_min(
64727+
double a,
64728+
double b)
64729+
{
64730+
return (a < b) ? a : b;
64731+
}
64732+
64733+
static
64734+
double flecs_max(
64735+
double a,
64736+
double b)
64737+
{
64738+
return (a > b) ? a : b;
64739+
}
64740+
64741+
static
64742+
double flecs_clamp(
64743+
double v,
64744+
double min,
64745+
double max)
64746+
{
64747+
if (v < min) {
64748+
return min;
64749+
} else if (v > max) {
64750+
return max;
64751+
} else {
64752+
return v;
64753+
}
64754+
}
64755+
64756+
static
64757+
double flecs_smoothstep(
64758+
double a,
64759+
double b,
64760+
double t)
64761+
{
64762+
double x = flecs_clamp((t - a) / (b - a), 0, 1);
64763+
return x * x * (3 - 2 * x);
64764+
}
64765+
64766+
void flecs_script_min(
64767+
const ecs_function_ctx_t *ctx,
64768+
int32_t argc,
64769+
const ecs_value_t *argv,
64770+
ecs_value_t *result)
64771+
{
64772+
double a = *(double*)argv[0].ptr;
64773+
double b = *(double*)argv[1].ptr;
64774+
*(double*)result->ptr = flecs_min(a, b);
64775+
}
64776+
64777+
void flecs_script_max(
64778+
const ecs_function_ctx_t *ctx,
64779+
int32_t argc,
64780+
const ecs_value_t *argv,
64781+
ecs_value_t *result)
64782+
{
64783+
double a = *(double*)argv[0].ptr;
64784+
double b = *(double*)argv[1].ptr;
64785+
*(double*)result->ptr = flecs_max(a, b);
64786+
}
64787+
6472564788
void flecs_script_lerp(
6472664789
const ecs_function_ctx_t *ctx,
6472764790
int32_t argc,
@@ -64734,6 +64797,30 @@ void flecs_script_lerp(
6473464797
*(double*)result->ptr = flecs_lerp(a, b, t);
6473564798
}
6473664799

64800+
void flecs_script_clamp(
64801+
const ecs_function_ctx_t *ctx,
64802+
int32_t argc,
64803+
const ecs_value_t *argv,
64804+
ecs_value_t *result)
64805+
{
64806+
double v = *(double*)argv[0].ptr;
64807+
double min = *(double*)argv[1].ptr;
64808+
double max = *(double*)argv[2].ptr;
64809+
*(double*)result->ptr = flecs_clamp(v, min, max);
64810+
}
64811+
64812+
void flecs_script_smoothstep(
64813+
const ecs_function_ctx_t *ctx,
64814+
int32_t argc,
64815+
const ecs_value_t *argv,
64816+
ecs_value_t *result)
64817+
{
64818+
double a = *(double*)argv[0].ptr;
64819+
double b = *(double*)argv[1].ptr;
64820+
double t = *(double*)argv[2].ptr;
64821+
*(double*)result->ptr = flecs_smoothstep(a, b, t);
64822+
}
64823+
6473764824
#define FLECS_MATH_FUNC_F64(name, ...)\
6473864825
static\
6473964826
void flecs_math_##name(\
@@ -64860,6 +64947,7 @@ FLECS_MATH_FUNC_F64(round, round(x))
6486064947

6486164948
FLECS_MATH_FUNC_F64(abs, fabs(x))
6486264949

64950+
6486364951
void FlecsScriptMathImport(
6486464952
ecs_world_t *world)
6486564953
{
@@ -64959,6 +65047,28 @@ void FlecsScriptMathImport(
6495965047
.callback = flecs_script_rng_get_uint
6496065048
});
6496165049

65050+
ecs_function(world, {
65051+
.name = "min",
65052+
.parent = ecs_id(FlecsScriptMath),
65053+
.return_type = ecs_id(ecs_f64_t),
65054+
.params = {
65055+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
65056+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
65057+
},
65058+
.callback = flecs_script_min
65059+
});
65060+
65061+
ecs_function(world, {
65062+
.name = "max",
65063+
.parent = ecs_id(FlecsScriptMath),
65064+
.return_type = ecs_id(ecs_f64_t),
65065+
.params = {
65066+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
65067+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
65068+
},
65069+
.callback = flecs_script_max
65070+
});
65071+
6496265072
ecs_function(world, {
6496365073
.name = "lerp",
6496465074
.parent = ecs_id(FlecsScriptMath),
@@ -64971,6 +65081,30 @@ void FlecsScriptMathImport(
6497165081
.callback = flecs_script_lerp
6497265082
});
6497365083

65084+
ecs_function(world, {
65085+
.name = "clamp",
65086+
.parent = ecs_id(FlecsScriptMath),
65087+
.return_type = ecs_id(ecs_f64_t),
65088+
.params = {
65089+
{ .name = "v", .type = ecs_id(ecs_f64_t) },
65090+
{ .name = "min", .type = ecs_id(ecs_f64_t) },
65091+
{ .name = "max", .type = ecs_id(ecs_f64_t) }
65092+
},
65093+
.callback = flecs_script_clamp
65094+
});
65095+
65096+
ecs_function(world, {
65097+
.name = "smoothstep",
65098+
.parent = ecs_id(FlecsScriptMath),
65099+
.return_type = ecs_id(ecs_f64_t),
65100+
.params = {
65101+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
65102+
{ .name = "b", .type = ecs_id(ecs_f64_t) },
65103+
{ .name = "t", .type = ecs_id(ecs_f64_t) }
65104+
},
65105+
.callback = flecs_script_smoothstep
65106+
});
65107+
6497465108
FlecsScriptMathPerlinImport(world);
6497565109
}
6497665110

src/addons/script/functions_math.c

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,69 @@ double flecs_lerp(
145145
return a + t * (b - a);
146146
}
147147

148+
static
149+
double flecs_min(
150+
double a,
151+
double b)
152+
{
153+
return (a < b) ? a : b;
154+
}
155+
156+
static
157+
double flecs_max(
158+
double a,
159+
double b)
160+
{
161+
return (a > b) ? a : b;
162+
}
163+
164+
static
165+
double flecs_clamp(
166+
double v,
167+
double min,
168+
double max)
169+
{
170+
if (v < min) {
171+
return min;
172+
} else if (v > max) {
173+
return max;
174+
} else {
175+
return v;
176+
}
177+
}
178+
179+
static
180+
double flecs_smoothstep(
181+
double a,
182+
double b,
183+
double t)
184+
{
185+
double x = flecs_clamp((t - a) / (b - a), 0, 1);
186+
return x * x * (3 - 2 * x);
187+
}
188+
189+
void flecs_script_min(
190+
const ecs_function_ctx_t *ctx,
191+
int32_t argc,
192+
const ecs_value_t *argv,
193+
ecs_value_t *result)
194+
{
195+
double a = *(double*)argv[0].ptr;
196+
double b = *(double*)argv[1].ptr;
197+
*(double*)result->ptr = flecs_min(a, b);
198+
}
199+
200+
void flecs_script_max(
201+
const ecs_function_ctx_t *ctx,
202+
int32_t argc,
203+
const ecs_value_t *argv,
204+
ecs_value_t *result)
205+
{
206+
double a = *(double*)argv[0].ptr;
207+
double b = *(double*)argv[1].ptr;
208+
*(double*)result->ptr = flecs_max(a, b);
209+
}
210+
148211
void flecs_script_lerp(
149212
const ecs_function_ctx_t *ctx,
150213
int32_t argc,
@@ -157,6 +220,30 @@ void flecs_script_lerp(
157220
*(double*)result->ptr = flecs_lerp(a, b, t);
158221
}
159222

223+
void flecs_script_clamp(
224+
const ecs_function_ctx_t *ctx,
225+
int32_t argc,
226+
const ecs_value_t *argv,
227+
ecs_value_t *result)
228+
{
229+
double v = *(double*)argv[0].ptr;
230+
double min = *(double*)argv[1].ptr;
231+
double max = *(double*)argv[2].ptr;
232+
*(double*)result->ptr = flecs_clamp(v, min, max);
233+
}
234+
235+
void flecs_script_smoothstep(
236+
const ecs_function_ctx_t *ctx,
237+
int32_t argc,
238+
const ecs_value_t *argv,
239+
ecs_value_t *result)
240+
{
241+
double a = *(double*)argv[0].ptr;
242+
double b = *(double*)argv[1].ptr;
243+
double t = *(double*)argv[2].ptr;
244+
*(double*)result->ptr = flecs_smoothstep(a, b, t);
245+
}
246+
160247
#define FLECS_MATH_FUNC_F64(name, ...)\
161248
static\
162249
void flecs_math_##name(\
@@ -283,6 +370,7 @@ FLECS_MATH_FUNC_F64(round, round(x))
283370

284371
FLECS_MATH_FUNC_F64(abs, fabs(x))
285372

373+
286374
void FlecsScriptMathImport(
287375
ecs_world_t *world)
288376
{
@@ -382,6 +470,28 @@ void FlecsScriptMathImport(
382470
.callback = flecs_script_rng_get_uint
383471
});
384472

473+
ecs_function(world, {
474+
.name = "min",
475+
.parent = ecs_id(FlecsScriptMath),
476+
.return_type = ecs_id(ecs_f64_t),
477+
.params = {
478+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
479+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
480+
},
481+
.callback = flecs_script_min
482+
});
483+
484+
ecs_function(world, {
485+
.name = "max",
486+
.parent = ecs_id(FlecsScriptMath),
487+
.return_type = ecs_id(ecs_f64_t),
488+
.params = {
489+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
490+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
491+
},
492+
.callback = flecs_script_max
493+
});
494+
385495
ecs_function(world, {
386496
.name = "lerp",
387497
.parent = ecs_id(FlecsScriptMath),
@@ -394,6 +504,30 @@ void FlecsScriptMathImport(
394504
.callback = flecs_script_lerp
395505
});
396506

507+
ecs_function(world, {
508+
.name = "clamp",
509+
.parent = ecs_id(FlecsScriptMath),
510+
.return_type = ecs_id(ecs_f64_t),
511+
.params = {
512+
{ .name = "v", .type = ecs_id(ecs_f64_t) },
513+
{ .name = "min", .type = ecs_id(ecs_f64_t) },
514+
{ .name = "max", .type = ecs_id(ecs_f64_t) }
515+
},
516+
.callback = flecs_script_clamp
517+
});
518+
519+
ecs_function(world, {
520+
.name = "smoothstep",
521+
.parent = ecs_id(FlecsScriptMath),
522+
.return_type = ecs_id(ecs_f64_t),
523+
.params = {
524+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
525+
{ .name = "b", .type = ecs_id(ecs_f64_t) },
526+
{ .name = "t", .type = ecs_id(ecs_f64_t) }
527+
},
528+
.callback = flecs_script_smoothstep
529+
});
530+
397531
FlecsScriptMathPerlinImport(world);
398532
}
399533

0 commit comments

Comments
 (0)