From: Wolfgang Bumiller Date: Tue, 8 Jan 2013 18:21:24 +0000 (+0100) Subject: sqrt and normalize builtins X-Git-Tag: before-library~344 X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=commitdiff_plain;h=6ece52355295276630566246cd7ccaf7c13620e4 sqrt and normalize builtins --- diff --git a/doc/qcvm.1 b/doc/qcvm.1 index 332cce9..de8633f 100644 --- a/doc/qcvm.1 +++ b/doc/qcvm.1 @@ -123,6 +123,16 @@ Concatenate two strings, returning a tempstring. .in +8 Compare two strings. Returns the same as the corresponding C functions. .in + +.RI "12) " vector " normalize (" vector ") = " "#12" ; +.in +8 +Normalize a vector so its length is 1. +.in + +.RI "13) " float " sqrt (" float ") = " "#13" ; +.in +8 +Get a value's square root. +.in .SH BUGS Please report bugs on , or see on how to contact us. diff --git a/exec.c b/exec.c index 2383ad7..5bff85e 100644 --- a/exec.c +++ b/exec.c @@ -733,6 +733,16 @@ static int qc_kill(qc_program *prog) return 0; } +static int qc_sqrt(qc_program *prog) +{ + qcany *num, out; + CheckArgs(1); + num = GetArg(0); + out._float = sqrt(num->_float); + Return(out); + return 0; +} + static int qc_vlen(qc_program *prog) { qcany *vec, len; @@ -745,6 +755,27 @@ static int qc_vlen(qc_program *prog) return 0; } +static int qc_normalize(qc_program *prog) +{ + double len; + qcany *vec; + qcany out; + CheckArgs(1); + vec = GetArg(0); + len = sqrt(vec->vector[0] * vec->vector[0] + + vec->vector[1] * vec->vector[1] + + vec->vector[2] * vec->vector[2]); + if (len) + len = 1.0 / len; + else + len = 0; + out.vector[0] = len * vec->vector[0]; + out.vector[1] = len * vec->vector[1]; + out.vector[2] = len * vec->vector[2]; + Return(out); + return 0; +} + static int qc_strcat(qc_program *prog) { char *buffer; @@ -795,17 +826,19 @@ static int qc_strcmp(qc_program *prog) static prog_builtin qc_builtins[] = { NULL, - &qc_print, /* 1 */ - &qc_ftos, /* 2 */ - &qc_spawn, /* 3 */ - &qc_kill, /* 4 */ - &qc_vtos, /* 5 */ - &qc_error, /* 6 */ - &qc_vlen, /* 7 */ - &qc_etos, /* 8 */ - &qc_stof, /* 9 */ - &qc_strcat, /* 10 */ - &qc_strcmp /* 11 */ + &qc_print, /* 1 */ + &qc_ftos, /* 2 */ + &qc_spawn, /* 3 */ + &qc_kill, /* 4 */ + &qc_vtos, /* 5 */ + &qc_error, /* 6 */ + &qc_vlen, /* 7 */ + &qc_etos, /* 8 */ + &qc_stof, /* 9 */ + &qc_strcat, /* 10 */ + &qc_strcmp, /* 11 */ + &qc_normalize, /* 12 */ + &qc_sqrt /* 13 */ }; static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]);