mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-06-03 01:51:02 +00:00
[gatest] Parse division and dual operations
This commit is contained in:
parent
4e441d359a
commit
681629a5d1
3 changed files with 26 additions and 10 deletions
|
@ -117,7 +117,7 @@ typedef enum {
|
||||||
OPENS, CLOSES,
|
OPENS, CLOSES,
|
||||||
MUL, DIV, PLUS, MINUS,
|
MUL, DIV, PLUS, MINUS,
|
||||||
WEDGE, ANTIWEDGE, DOT,
|
WEDGE, ANTIWEDGE, DOT,
|
||||||
REVERSE,
|
REVERSE, DUAL,
|
||||||
} token_e;
|
} token_e;
|
||||||
|
|
||||||
script_t script;
|
script_t script;
|
||||||
|
@ -157,6 +157,7 @@ get_token ()
|
||||||
case "&": return {ANTIWEDGE, nil};
|
case "&": return {ANTIWEDGE, nil};
|
||||||
case ".": return {DOT, nil};
|
case ".": return {DOT, nil};
|
||||||
case "~": return {REVERSE, nil};
|
case "~": return {REVERSE, nil};
|
||||||
|
case "!": return {DUAL, nil};
|
||||||
}
|
}
|
||||||
return {ID, .name = token_str };
|
return {ID, .name = token_str };
|
||||||
}
|
}
|
||||||
|
@ -164,7 +165,8 @@ get_token ()
|
||||||
static void
|
static void
|
||||||
syntax_error ()
|
syntax_error ()
|
||||||
{
|
{
|
||||||
obj_error (nil, 0, "syntax error: %d\n", Script_GetLine (script));
|
obj_error (nil, 0, "syntax error before `%s': %d\n", token_str,
|
||||||
|
Script_GetLine (script));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -206,10 +208,13 @@ factor ()
|
||||||
MultiVector *vec;
|
MultiVector *vec;
|
||||||
if (match (REVERSE)) {
|
if (match (REVERSE)) {
|
||||||
advance ();
|
advance ();
|
||||||
vec = [expression () reverse];
|
vec = [factor () reverse];
|
||||||
|
} else if (match (DUAL)) {
|
||||||
|
advance ();
|
||||||
|
vec = [factor () dual];
|
||||||
} else if (match (MINUS)) {
|
} else if (match (MINUS)) {
|
||||||
advance ();
|
advance ();
|
||||||
vec = [minus_one product:expression ()];
|
vec = [minus_one product:factor ()];
|
||||||
} else if (match (OPENP)) {
|
} else if (match (OPENP)) {
|
||||||
advance ();
|
advance ();
|
||||||
vec = expression ();
|
vec = expression ();
|
||||||
|
@ -289,10 +294,11 @@ term ()
|
||||||
} else {
|
} else {
|
||||||
vec = high_term ();
|
vec = high_term ();
|
||||||
}
|
}
|
||||||
if (match (REVERSE) || match (OPENP) || match (ID)) {
|
if (match (REVERSE) || match (DUAL) || match (OPENP) || match (ID)) {
|
||||||
op = @selector(product:);
|
op = @selector(product:);
|
||||||
// } else if (match (DIV)) {
|
} else if (match (DIV)) {
|
||||||
// advance ();
|
op = @selector(divide:);
|
||||||
|
advance ();
|
||||||
} else {
|
} else {
|
||||||
return vec;
|
return vec;
|
||||||
}
|
}
|
||||||
|
@ -362,7 +368,7 @@ static int
|
||||||
parse_script (string name, QFile file)
|
parse_script (string name, QFile file)
|
||||||
{
|
{
|
||||||
script = Script_New ();
|
script = Script_New ();
|
||||||
Script_SetSingle (script, "()[]{}/+-^&.~=;");
|
Script_SetSingle (script, "()[]{}/+-^&.~=;!");
|
||||||
token_str = Script_FromFile (script, name, file);
|
token_str = Script_FromFile (script, name, file);
|
||||||
|
|
||||||
while (!match (EOF)) {
|
while (!match (EOF)) {
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
-(double *) componentFor:(BasisBlade *) blade;
|
-(double *) componentFor:(BasisBlade *) blade;
|
||||||
|
|
||||||
-(MultiVector *) product:(MultiVector *) rhs;
|
-(MultiVector *) product:(MultiVector *) rhs;
|
||||||
|
-(MultiVector *) divide:(MultiVector *) rhs;
|
||||||
-(MultiVector *) wedge:(MultiVector *) rhs;
|
-(MultiVector *) wedge:(MultiVector *) rhs;
|
||||||
-(MultiVector *) dot:(MultiVector *) rhs;
|
-(MultiVector *) dot:(MultiVector *) rhs;
|
||||||
-(MultiVector *) plus:(MultiVector *) rhs;
|
-(MultiVector *) plus:(MultiVector *) rhs;
|
||||||
|
|
|
@ -131,6 +131,17 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout)
|
||||||
return prod;
|
return prod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(MultiVector *) divide:(MultiVector *) rhs
|
||||||
|
{
|
||||||
|
MultiVector *sqr = [rhs product:rhs];
|
||||||
|
double smag = sqr.components[[sqr indexFor:0]];
|
||||||
|
MultiVector *div = [self product:rhs];
|
||||||
|
for (int i = 0; i < div.num_components; i++) {
|
||||||
|
div.components[i] /= smag;
|
||||||
|
}
|
||||||
|
return div;
|
||||||
|
}
|
||||||
|
|
||||||
-(MultiVector *) wedge:(MultiVector *) rhs
|
-(MultiVector *) wedge:(MultiVector *) rhs
|
||||||
{
|
{
|
||||||
MultiVector *prod = new_mv (algebra, nil);
|
MultiVector *prod = new_mv (algebra, nil);
|
||||||
|
@ -246,7 +257,6 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout)
|
||||||
{
|
{
|
||||||
MultiVector *dual = new_mv (algebra, nil);
|
MultiVector *dual = new_mv (algebra, nil);
|
||||||
unsigned dual_mask = (1 << [algebra dimension]) - 1;
|
unsigned dual_mask = (1 << [algebra dimension]) - 1;
|
||||||
printf ("dual: %x %d\n", dual_mask, [algebra dimension]);
|
|
||||||
for (int i = 0; i < num_components; i++) {
|
for (int i = 0; i < num_components; i++) {
|
||||||
if (!components[i]) {
|
if (!components[i]) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -256,7 +266,6 @@ static MultiVector *new_mv (Algebra *algebra, BasisLayout *layout)
|
||||||
unsigned mask = [lb mask] ^ dual_mask;
|
unsigned mask = [lb mask] ^ dual_mask;
|
||||||
double s = 1;
|
double s = 1;
|
||||||
int ind = [layout bladeIndex:mask];
|
int ind = [layout bladeIndex:mask];
|
||||||
printf (" : %x %d\n", mask, ind);
|
|
||||||
dual.components[ind] += s * lc;
|
dual.components[ind] += s * lc;
|
||||||
}
|
}
|
||||||
return dual;
|
return dual;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue