mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +00:00
[qfcc] Correct scaling and multivec sums
Scaling now works for multi-vector expressions, and always subtracting even when addition is wanted doesn't work too well. However, now there's the problem of multi-vectors very quickly becoming full algebra vectors, which means certain things need a rethink.
This commit is contained in:
parent
2e91b29580
commit
dfb719c92b
1 changed files with 9 additions and 5 deletions
|
@ -56,17 +56,17 @@ scalar_product (expr_t *e1, expr_t *e2)
|
||||||
{
|
{
|
||||||
auto scalar = is_scalar (get_type (e1)) ? e1 : e2;
|
auto scalar = is_scalar (get_type (e1)) ? e1 : e2;
|
||||||
auto vector = is_scalar (get_type (e1)) ? e2 : e1;
|
auto vector = is_scalar (get_type (e1)) ? e2 : e1;
|
||||||
if (vector->type == ex_vector) {
|
if (vector->type == ex_multivec) {
|
||||||
internal_error (vector, "multiproduce scale not implemented");
|
auto comp = vector->e.multivec.components;
|
||||||
auto comp = vector->e.vector.list;
|
|
||||||
auto prod = scalar_product (scalar, comp);
|
auto prod = scalar_product (scalar, comp);
|
||||||
while (comp->next) {
|
while (comp->next) {
|
||||||
comp = comp->next;
|
comp = comp->next;
|
||||||
auto p = scalar_product (scalar, comp);
|
auto p = scalar_product (scalar, comp);
|
||||||
|
p = fold_constants (p);
|
||||||
p->next = prod;
|
p->next = prod;
|
||||||
prod = p;
|
prod = p;
|
||||||
}
|
}
|
||||||
return fold_constants (prod);
|
return prod;
|
||||||
} else {
|
} else {
|
||||||
auto vector_type = get_type (vector);
|
auto vector_type = get_type (vector);
|
||||||
auto scalar_type = base_type (vector_type);
|
auto scalar_type = base_type (vector_type);
|
||||||
|
@ -127,7 +127,11 @@ component_sum (int op, expr_t **components, expr_t *e,
|
||||||
components[group] = new_binary_expr (op, components[group], e);
|
components[group] = new_binary_expr (op, components[group], e);
|
||||||
components[group]->e.expr.type = t;
|
components[group]->e.expr.type = t;
|
||||||
} else {
|
} else {
|
||||||
components[group] = scalar_product (new_float_expr (-1), e);
|
if (op == '+') {
|
||||||
|
components[group] = e;
|
||||||
|
} else {
|
||||||
|
components[group] = scalar_product (new_float_expr (-1), e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
components[group] = fold_constants (components[group]);
|
components[group] = fold_constants (components[group]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue