Skip to content

Commit 2d4b6b8

Browse files
committed
Add more script math functions
1 parent 1645e98 commit 2d4b6b8

File tree

2 files changed

+288
-0
lines changed

2 files changed

+288
-0
lines changed

distr/flecs.c

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64722,18 +64722,115 @@ 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+
(void)ctx;
64773+
(void)argc;
64774+
double a = *(double*)argv[0].ptr;
64775+
double b = *(double*)argv[1].ptr;
64776+
*(double*)result->ptr = flecs_min(a, b);
64777+
}
64778+
64779+
void flecs_script_max(
64780+
const ecs_function_ctx_t *ctx,
64781+
int32_t argc,
64782+
const ecs_value_t *argv,
64783+
ecs_value_t *result)
64784+
{
64785+
(void)ctx;
64786+
(void)argc;
64787+
double a = *(double*)argv[0].ptr;
64788+
double b = *(double*)argv[1].ptr;
64789+
*(double*)result->ptr = flecs_max(a, b);
64790+
}
64791+
6472564792
void flecs_script_lerp(
6472664793
const ecs_function_ctx_t *ctx,
6472764794
int32_t argc,
6472864795
const ecs_value_t *argv,
6472964796
ecs_value_t *result)
6473064797
{
64798+
(void)ctx;
64799+
(void)argc;
6473164800
double a = *(double*)argv[0].ptr;
6473264801
double b = *(double*)argv[1].ptr;
6473364802
double t = *(double*)argv[2].ptr;
6473464803
*(double*)result->ptr = flecs_lerp(a, b, t);
6473564804
}
6473664805

64806+
void flecs_script_clamp(
64807+
const ecs_function_ctx_t *ctx,
64808+
int32_t argc,
64809+
const ecs_value_t *argv,
64810+
ecs_value_t *result)
64811+
{
64812+
(void)ctx;
64813+
(void)argc;
64814+
double v = *(double*)argv[0].ptr;
64815+
double min = *(double*)argv[1].ptr;
64816+
double max = *(double*)argv[2].ptr;
64817+
*(double*)result->ptr = flecs_clamp(v, min, max);
64818+
}
64819+
64820+
void flecs_script_smoothstep(
64821+
const ecs_function_ctx_t *ctx,
64822+
int32_t argc,
64823+
const ecs_value_t *argv,
64824+
ecs_value_t *result)
64825+
{
64826+
(void)ctx;
64827+
(void)argc;
64828+
double a = *(double*)argv[0].ptr;
64829+
double b = *(double*)argv[1].ptr;
64830+
double t = *(double*)argv[2].ptr;
64831+
*(double*)result->ptr = flecs_smoothstep(a, b, t);
64832+
}
64833+
6473764834
#define FLECS_MATH_FUNC_F64(name, ...)\
6473864835
static\
6473964836
void flecs_math_##name(\
@@ -64860,6 +64957,7 @@ FLECS_MATH_FUNC_F64(round, round(x))
6486064957

6486164958
FLECS_MATH_FUNC_F64(abs, fabs(x))
6486264959

64960+
6486364961
void FlecsScriptMathImport(
6486464962
ecs_world_t *world)
6486564963
{
@@ -64959,6 +65057,28 @@ void FlecsScriptMathImport(
6495965057
.callback = flecs_script_rng_get_uint
6496065058
});
6496165059

65060+
ecs_function(world, {
65061+
.name = "min",
65062+
.parent = ecs_id(FlecsScriptMath),
65063+
.return_type = ecs_id(ecs_f64_t),
65064+
.params = {
65065+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
65066+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
65067+
},
65068+
.callback = flecs_script_min
65069+
});
65070+
65071+
ecs_function(world, {
65072+
.name = "max",
65073+
.parent = ecs_id(FlecsScriptMath),
65074+
.return_type = ecs_id(ecs_f64_t),
65075+
.params = {
65076+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
65077+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
65078+
},
65079+
.callback = flecs_script_max
65080+
});
65081+
6496265082
ecs_function(world, {
6496365083
.name = "lerp",
6496465084
.parent = ecs_id(FlecsScriptMath),
@@ -64971,6 +65091,30 @@ void FlecsScriptMathImport(
6497165091
.callback = flecs_script_lerp
6497265092
});
6497365093

65094+
ecs_function(world, {
65095+
.name = "clamp",
65096+
.parent = ecs_id(FlecsScriptMath),
65097+
.return_type = ecs_id(ecs_f64_t),
65098+
.params = {
65099+
{ .name = "v", .type = ecs_id(ecs_f64_t) },
65100+
{ .name = "min", .type = ecs_id(ecs_f64_t) },
65101+
{ .name = "max", .type = ecs_id(ecs_f64_t) }
65102+
},
65103+
.callback = flecs_script_clamp
65104+
});
65105+
65106+
ecs_function(world, {
65107+
.name = "smoothstep",
65108+
.parent = ecs_id(FlecsScriptMath),
65109+
.return_type = ecs_id(ecs_f64_t),
65110+
.params = {
65111+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
65112+
{ .name = "b", .type = ecs_id(ecs_f64_t) },
65113+
{ .name = "t", .type = ecs_id(ecs_f64_t) }
65114+
},
65115+
.callback = flecs_script_smoothstep
65116+
});
65117+
6497465118
FlecsScriptMathPerlinImport(world);
6497565119
}
6497665120

src/addons/script/functions_math.c

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,18 +145,115 @@ 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+
(void)ctx;
196+
(void)argc;
197+
double a = *(double*)argv[0].ptr;
198+
double b = *(double*)argv[1].ptr;
199+
*(double*)result->ptr = flecs_min(a, b);
200+
}
201+
202+
void flecs_script_max(
203+
const ecs_function_ctx_t *ctx,
204+
int32_t argc,
205+
const ecs_value_t *argv,
206+
ecs_value_t *result)
207+
{
208+
(void)ctx;
209+
(void)argc;
210+
double a = *(double*)argv[0].ptr;
211+
double b = *(double*)argv[1].ptr;
212+
*(double*)result->ptr = flecs_max(a, b);
213+
}
214+
148215
void flecs_script_lerp(
149216
const ecs_function_ctx_t *ctx,
150217
int32_t argc,
151218
const ecs_value_t *argv,
152219
ecs_value_t *result)
153220
{
221+
(void)ctx;
222+
(void)argc;
154223
double a = *(double*)argv[0].ptr;
155224
double b = *(double*)argv[1].ptr;
156225
double t = *(double*)argv[2].ptr;
157226
*(double*)result->ptr = flecs_lerp(a, b, t);
158227
}
159228

229+
void flecs_script_clamp(
230+
const ecs_function_ctx_t *ctx,
231+
int32_t argc,
232+
const ecs_value_t *argv,
233+
ecs_value_t *result)
234+
{
235+
(void)ctx;
236+
(void)argc;
237+
double v = *(double*)argv[0].ptr;
238+
double min = *(double*)argv[1].ptr;
239+
double max = *(double*)argv[2].ptr;
240+
*(double*)result->ptr = flecs_clamp(v, min, max);
241+
}
242+
243+
void flecs_script_smoothstep(
244+
const ecs_function_ctx_t *ctx,
245+
int32_t argc,
246+
const ecs_value_t *argv,
247+
ecs_value_t *result)
248+
{
249+
(void)ctx;
250+
(void)argc;
251+
double a = *(double*)argv[0].ptr;
252+
double b = *(double*)argv[1].ptr;
253+
double t = *(double*)argv[2].ptr;
254+
*(double*)result->ptr = flecs_smoothstep(a, b, t);
255+
}
256+
160257
#define FLECS_MATH_FUNC_F64(name, ...)\
161258
static\
162259
void flecs_math_##name(\
@@ -283,6 +380,7 @@ FLECS_MATH_FUNC_F64(round, round(x))
283380

284381
FLECS_MATH_FUNC_F64(abs, fabs(x))
285382

383+
286384
void FlecsScriptMathImport(
287385
ecs_world_t *world)
288386
{
@@ -382,6 +480,28 @@ void FlecsScriptMathImport(
382480
.callback = flecs_script_rng_get_uint
383481
});
384482

483+
ecs_function(world, {
484+
.name = "min",
485+
.parent = ecs_id(FlecsScriptMath),
486+
.return_type = ecs_id(ecs_f64_t),
487+
.params = {
488+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
489+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
490+
},
491+
.callback = flecs_script_min
492+
});
493+
494+
ecs_function(world, {
495+
.name = "max",
496+
.parent = ecs_id(FlecsScriptMath),
497+
.return_type = ecs_id(ecs_f64_t),
498+
.params = {
499+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
500+
{ .name = "b", .type = ecs_id(ecs_f64_t) }
501+
},
502+
.callback = flecs_script_max
503+
});
504+
385505
ecs_function(world, {
386506
.name = "lerp",
387507
.parent = ecs_id(FlecsScriptMath),
@@ -394,6 +514,30 @@ void FlecsScriptMathImport(
394514
.callback = flecs_script_lerp
395515
});
396516

517+
ecs_function(world, {
518+
.name = "clamp",
519+
.parent = ecs_id(FlecsScriptMath),
520+
.return_type = ecs_id(ecs_f64_t),
521+
.params = {
522+
{ .name = "v", .type = ecs_id(ecs_f64_t) },
523+
{ .name = "min", .type = ecs_id(ecs_f64_t) },
524+
{ .name = "max", .type = ecs_id(ecs_f64_t) }
525+
},
526+
.callback = flecs_script_clamp
527+
});
528+
529+
ecs_function(world, {
530+
.name = "smoothstep",
531+
.parent = ecs_id(FlecsScriptMath),
532+
.return_type = ecs_id(ecs_f64_t),
533+
.params = {
534+
{ .name = "a", .type = ecs_id(ecs_f64_t) },
535+
{ .name = "b", .type = ecs_id(ecs_f64_t) },
536+
{ .name = "t", .type = ecs_id(ecs_f64_t) }
537+
},
538+
.callback = flecs_script_smoothstep
539+
});
540+
397541
FlecsScriptMathPerlinImport(world);
398542
}
399543

0 commit comments

Comments
 (0)