mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-29 07:32:02 +00:00
[qfcc] Implement wedge products for 3d VGA
That was pretty easy, but necessary for trying out barycentric coordinates in geometric algebra :)
This commit is contained in:
parent
5c32077c2a
commit
6096edb1ca
1 changed files with 44 additions and 0 deletions
|
@ -1147,6 +1147,44 @@ static pga_func pga2_wedge_funcs[4][4] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
vga2_x_y_z_wedge_x_y_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
||||||
|
{
|
||||||
|
c[2] = cross_expr (algebra_mvec_type (alg, 0x04), a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vga2_x_y_w_wedge_yz_zx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
||||||
|
{
|
||||||
|
c[3] = dot_expr (algebra_mvec_type (alg, 0x08), a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vga2_yz_zx_xy_wedge_x_y_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
||||||
|
{
|
||||||
|
c[3] = dot_expr (algebra_mvec_type (alg, 0x08), a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pga_func vga3_wedge_funcs[4][4] = {
|
||||||
|
[0] = {
|
||||||
|
[0] = scale_component,
|
||||||
|
[1] = scale_component,
|
||||||
|
[2] = scale_component,
|
||||||
|
[3] = scale_component,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
[0] = scale_component,
|
||||||
|
[1] = vga2_x_y_z_wedge_x_y_w,
|
||||||
|
[2] = vga2_x_y_w_wedge_yz_zx_xy,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
[0] = scale_component,
|
||||||
|
[1] = vga2_yz_zx_xy_wedge_x_y_w,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
component_wedge (expr_t **c, expr_t *a, expr_t *b, algebra_t *algebra)
|
component_wedge (expr_t **c, expr_t *a, expr_t *b, algebra_t *algebra)
|
||||||
{
|
{
|
||||||
|
@ -1166,6 +1204,12 @@ component_wedge (expr_t **c, expr_t *a, expr_t *b, algebra_t *algebra)
|
||||||
if (pga2_wedge_funcs[ga][gb]) {
|
if (pga2_wedge_funcs[ga][gb]) {
|
||||||
pga2_wedge_funcs[ga][gb] (c, a, b, algebra);
|
pga2_wedge_funcs[ga][gb] (c, a, b, algebra);
|
||||||
}
|
}
|
||||||
|
} else if (p == 3 && m == 0 && z == 0) {
|
||||||
|
int ga = get_group (get_type (a), algebra);
|
||||||
|
int gb = get_group (get_type (b), algebra);
|
||||||
|
if (vga3_wedge_funcs[ga][gb]) {
|
||||||
|
vga3_wedge_funcs[ga][gb] (c, a, b, algebra);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
internal_error (a, "not implemented");
|
internal_error (a, "not implemented");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue