compile fixes (oops) and start working on quaternion support in qfcc

This commit is contained in:
Bill Currie 2004-04-08 02:33:20 +00:00
parent 8d6f634f30
commit 4882005a49
7 changed files with 21 additions and 33 deletions

View file

@ -523,7 +523,7 @@ value_string (progs_t *pr, etype_t type, pr_type_t *val)
else else
dsprintf (line, "[$%x]", ofs); dsprintf (line, "[$%x]", ofs);
break; break;
case ev_quaternion: case ev_quat:
dsprintf (line, "'%g %g %g %g'", dsprintf (line, "'%g %g %g %g'",
val->vector_var[0], val->vector_var[1], val->vector_var[0], val->vector_var[1],
val->vector_var[2], val->vector_var[3]); val->vector_var[2], val->vector_var[3]);

View file

@ -339,7 +339,7 @@ set_address (sv_def_t *def, void *address)
break; break;
case ev_float: case ev_float:
case ev_vector: case ev_vector:
case ev_quaternion: case ev_quat:
*(float **)def->field = (float *) address; *(float **)def->field = (float *) address;
break; break;
case ev_string: case ev_string:

View file

@ -338,7 +338,7 @@ set_address (sv_def_t *def, void *address)
break; break;
case ev_float: case ev_float:
case ev_vector: case ev_vector:
case ev_quaternion: case ev_quat:
*(float **)def->field = (float *) address; *(float **)def->field = (float *) address;
break; break;
case ev_string: case ev_string:

View file

@ -342,15 +342,11 @@ do_op_vector (int op, expr_t *e, expr_t *e1, expr_t *e2)
break; break;
case EQ: case EQ:
e1->type = ex_integer; e1->type = ex_integer;
e1->e.integer_val = (v1[0] == v2[0]) e1->e.integer_val = VectorCompare (v1, v2);
&& (v1[1] == v2[1])
&& (v1[2] == v2[2]);
break; break;
case NE: case NE:
e1->type = ex_integer; e1->type = ex_integer;
e1->e.integer_val = (v1[0] == v2[0]) e1->e.integer_val = !VectorCompare (v1, v2);
|| (v1[1] != v2[1])
|| (v1[2] != v2[2]);
break; break;
default: default:
internal_error (e1); internal_error (e1);
@ -415,7 +411,7 @@ do_op_pointer (int op, expr_t *e, expr_t *e1, expr_t *e2)
static int valid[] = {'=', 'b', PAS, '&', 'M', '.', EQ, NE, 0}; static int valid[] = {'=', 'b', PAS, '&', 'M', '.', EQ, NE, 0};
if (!valid_op (op, valid)) if (!valid_op (op, valid))
return error (e1, "invalid operand for quaternion"); return error (e1, "invalid operand for pointer");
if (op == PAS && (type = get_type (e1)->aux_type) != get_type (e2)) { if (op == PAS && (type = get_type (e1)->aux_type) != get_type (e2)) {
// make sure auto-convertions happen // make sure auto-convertions happen
@ -487,40 +483,32 @@ do_op_quaternion (int op, expr_t *e, expr_t *e1, expr_t *e2)
switch (op) { switch (op) {
case '+': case '+':
VectorAdd (q1, q2, q1); QuatAdd (q1, q2, q1);
break; break;
case '-': case '-':
VectorSubtract (q1, q2, q1); QuatSubtract (q1, q2, q1);
break; break;
case '/': case '/':
if (!q2[0]) if (!q2[0])
return error (e1, "divide by zero"); return error (e1, "divide by zero");
VectorScale (q1, 1 / q2[0], q1); QuatScale (q1, 1 / q2[0], q1);
q1[3] /= q2[0]; q1[3] /= q2[0];
break; break;
case '*': case '*':
if (get_type (e2) == &type_quaternion) { if (get_type (e2) == &type_quaternion) {
e1->type = ex_float; QuatMult (q1, q2, q1);
e1->e.float_val = DotProduct (q1, q2);
e1->e.float_val += q1[3] * q2[3];
} else { } else {
VectorScale (q1, q2[0], q1); QuatScale (q1, q2[0], q1);
q1[3] *= q2[0]; q1[3] *= q2[0];
} }
break; break;
case EQ: case EQ:
e1->type = ex_integer; e1->type = ex_integer;
e1->e.integer_val = (q1[0] == q2[0]) e1->e.integer_val = QuatCompare (q1, q2);
&& (q1[1] == q2[1])
&& (q1[2] == q2[2])
&& (q1[3] == q2[3]);
break; break;
case NE: case NE:
e1->type = ex_integer; e1->type = ex_integer;
e1->e.integer_val = (q1[0] == q2[0]) e1->e.integer_val = !QuatCompare (q1, q2);
|| (q1[1] != q2[1])
|| (q1[2] != q2[2])
|| (q1[3] != q2[3]);
break; break;
default: default:
internal_error (e1); internal_error (e1);
@ -1075,7 +1063,7 @@ static operation_t op_quaternion[ev_type_count] = {
do_op_invalid, // ev_void do_op_invalid, // ev_void
do_op_invalid, // ev_string do_op_invalid, // ev_string
do_op_quaternion, // ev_float do_op_quaternion, // ev_float
do_op_quaternion, // ev_vector do_op_invalid, // ev_vector
do_op_invalid, // ev_entity do_op_invalid, // ev_entity
do_op_invalid, // ev_field do_op_invalid, // ev_field
do_op_invalid, // ev_func do_op_invalid, // ev_func

View file

@ -86,7 +86,7 @@ etype_t qc_types[] = {
ev_field, // ex_field ev_field, // ex_field
ev_func, // ex_func ev_func, // ex_func
ev_pointer, // ex_pointer ev_pointer, // ex_pointer
ev_quaternion, // ex_quaternion ev_quat, // ex_quaternion
ev_integer, // ex_integer ev_integer, // ex_integer
ev_uinteger, // ex_uinteger ev_uinteger, // ex_uinteger
ev_short, // ex_short ev_short, // ex_short
@ -121,7 +121,7 @@ expr_type expr_types[] = {
ex_field, // ev_field ex_field, // ev_field
ex_func, // ev_func ex_func, // ev_func
ex_pointer, // ev_pointer ex_pointer, // ev_pointer
ex_quaternion, // ev_quaternion ex_quaternion, // ev_quat
ex_integer, // ev_integer ex_integer, // ev_integer
ex_uinteger, // ev_uinteger ex_uinteger, // ev_uinteger
ex_short, // ev_short ex_short, // ev_short
@ -1054,7 +1054,7 @@ test_expr (expr_t *e, int test)
case ev_pointer: case ev_pointer:
new = new_nil_expr (); new = new_nil_expr ();
break; break;
case ev_quaternion: case ev_quat:
new = new_quaternion_expr (zero); new = new_quaternion_expr (zero);
break; break;
case ev_struct: case ev_struct:

View file

@ -247,7 +247,7 @@ get_auxtype (const char *type)
case '^': case '^':
return ev_pointer; return ev_pointer;
case 'Q': case 'Q':
return ev_quaternion; return ev_quat;
case 'i': case 'i':
return ev_integer; return ev_integer;
case 'I': case 'I':

View file

@ -74,7 +74,7 @@ type_t type_field = { ev_field, "field", NULL, &type_void };
// type_function is a void() function used for state defs // type_function is a void() function used for state defs
type_t type_function = { ev_func, "function", NULL, &type_void }; type_t type_function = { ev_func, "function", NULL, &type_void };
type_t type_pointer = { ev_pointer, "pointer", NULL, &type_void }; type_t type_pointer = { ev_pointer, "pointer", NULL, &type_void };
type_t type_quaternion = { ev_quaternion, "quaternion" }; type_t type_quaternion = { ev_quat, "quaternion" };
type_t type_integer = { ev_integer, "integer" }; type_t type_integer = { ev_integer, "integer" };
type_t type_uinteger = { ev_uinteger, "uiniteger" }; type_t type_uinteger = { ev_uinteger, "uiniteger" };
type_t type_short = { ev_short, "short" }; type_t type_short = { ev_short, "short" };
@ -351,7 +351,7 @@ _encode_type (dstring_t *encoding, type_t *type, int level)
break; break;
} }
break; break;
case ev_quaternion: case ev_quat:
dstring_appendstr (encoding, "Q"); dstring_appendstr (encoding, "Q");
break; break;
case ev_integer: case ev_integer:
@ -601,7 +601,7 @@ type_size (type_t *type)
case ev_field: case ev_field:
case ev_func: case ev_func:
case ev_pointer: case ev_pointer:
case ev_quaternion: case ev_quat:
case ev_integer: case ev_integer:
case ev_uinteger: case ev_uinteger:
case ev_short: case ev_short: