mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
quaternion field access now works
This commit is contained in:
parent
332ec82495
commit
7b28c555ba
3 changed files with 61 additions and 32 deletions
|
@ -173,7 +173,7 @@ expr_t *new_vector_expr (float *vector_val);
|
|||
expr_t *new_entity_expr (int entity_val);
|
||||
expr_t *new_field_expr (int field_val);
|
||||
expr_t *new_func_expr (int func_val);
|
||||
//expr_t *new_pointer_expr ();
|
||||
expr_t *new_pointer_expr (int val, struct type_s *type, struct def_s *def);
|
||||
expr_t *new_quaternion_expr (float *quaternion_val);
|
||||
expr_t *new_integer_expr (int integer_val);
|
||||
expr_t *new_uinteger_expr (unsigned int uinteger_val);
|
||||
|
|
|
@ -531,7 +531,17 @@ new_func_expr (int func_val)
|
|||
return e;
|
||||
}
|
||||
|
||||
//expr_t *new_pointer_expr ();
|
||||
expr_t *
|
||||
new_pointer_expr (int val, type_t *type, def_t *def)
|
||||
{
|
||||
expr_t *e = new_expr ();
|
||||
e->type = ex_pointer;
|
||||
e->e.pointer.val = val;
|
||||
e->e.pointer.type = type;
|
||||
e->e.pointer.def = def;
|
||||
return e;
|
||||
}
|
||||
|
||||
expr_t *
|
||||
new_quaternion_expr (float *quaternion_val)
|
||||
{
|
||||
|
@ -590,7 +600,7 @@ constant_expr (expr_t *var)
|
|||
case ev_vector:
|
||||
return new_vector_expr (G_VECTOR (var->e.def->ofs));
|
||||
case ev_field:
|
||||
return new_field_expr (G_var (integer, var->e.def->ofs));
|
||||
return new_field_expr (G_INT (var->e.def->ofs));
|
||||
case ev_integer:
|
||||
return new_integer_expr (G_INT (var->e.def->ofs));
|
||||
case ev_uinteger:
|
||||
|
@ -931,20 +941,34 @@ field_expr (expr_t *e1, expr_t *e2)
|
|||
}
|
||||
break;
|
||||
case ev_vector:
|
||||
case ev_quat:
|
||||
if (!options.traditional && e2->type == ex_name) {
|
||||
field = struct_find_field (vector_struct, e2->e.string_val);
|
||||
if (!field)
|
||||
return error (e2, "vector has no field %s",
|
||||
e2->e.string_val);
|
||||
if (t1->type == ev_quat) {
|
||||
field = struct_find_field (quaternion_struct,
|
||||
e2->e.string_val);
|
||||
if (!field)
|
||||
return error (e2, "quaternion has no field %s",
|
||||
e2->e.string_val);
|
||||
} else {
|
||||
field = struct_find_field (vector_struct,
|
||||
e2->e.string_val);
|
||||
if (!field)
|
||||
return error (e2, "vector has no field %s",
|
||||
e2->e.string_val);
|
||||
}
|
||||
switch (e1->type) {
|
||||
case ex_expr:
|
||||
if (e1->e.expr.op == '.'
|
||||
&& extract_type (e1->e.expr.e1) == ev_entity
|
||||
&& e1->e.expr.e2->type == ex_def) {
|
||||
d = e1->e.expr.e2->e.def->def_next;
|
||||
for (i = field->offset; i; i--)
|
||||
d = d->def_next;
|
||||
e = new_def_expr (d);
|
||||
&& extract_type (e1->e.expr.e1) == ev_entity) {
|
||||
int ofs;
|
||||
|
||||
if (e1->e.expr.e2->type == ex_def)
|
||||
ofs = e1->e.expr.e2->e.def->ofs;
|
||||
else if (e1->e.expr.e2->type == ex_field)
|
||||
ofs = e1->e.expr.e2->e.field_val;
|
||||
else
|
||||
break;
|
||||
e = new_field_expr (ofs + field->offset);
|
||||
e = new_binary_expr ('.', e1->e.expr.e1, e);
|
||||
e->e.expr.type = field->type;
|
||||
return e;
|
||||
|
@ -953,13 +977,11 @@ field_expr (expr_t *e1, expr_t *e2)
|
|||
case ex_uexpr:
|
||||
if (e1->e.expr.op == '.') {
|
||||
if (e1->e.expr.e1->type == ex_pointer) {
|
||||
e = new_expr ();
|
||||
e->type = ex_pointer;
|
||||
e1 = e1->e.expr.e1;
|
||||
i = e1->e.pointer.val;
|
||||
e->e.pointer.val = i + field->offset;
|
||||
e = e1->e.expr.e1;
|
||||
e->e.pointer.val += field->offset;
|
||||
e->e.pointer.type = field->type;
|
||||
return unary_expr ('.', e);
|
||||
e1->e.expr.type = field->type;
|
||||
return e1;
|
||||
} else if (extract_type (e1->e.expr.e1)
|
||||
== ev_pointer) {
|
||||
e = new_integer_expr (field->offset);
|
||||
|
@ -979,14 +1001,29 @@ field_expr (expr_t *e1, expr_t *e2)
|
|||
#endif
|
||||
break;
|
||||
case ex_def:
|
||||
d = e1->e.def->def_next;
|
||||
for (i = field->offset; i; i--)
|
||||
d = d->def_next;
|
||||
e = new_def_expr (d);
|
||||
if (t1->type == ev_quat) {
|
||||
e = new_pointer_expr (field->offset, field->type,
|
||||
e1->e.def);
|
||||
e = unary_expr ('.', e);
|
||||
return e;
|
||||
} else {
|
||||
d = e1->e.def->def_next;
|
||||
for (i = field->offset; i; i--)
|
||||
d = d->def_next;
|
||||
e = new_def_expr (d);
|
||||
}
|
||||
return e;
|
||||
case ex_vector:
|
||||
e = new_float_expr (e1->e.vector_val[field->offset]);
|
||||
return e;
|
||||
case ex_quaternion:
|
||||
if (field->type == &type_float)
|
||||
e = new_float_expr (*(e1->e.quaternion_val
|
||||
+ field->offset));
|
||||
else
|
||||
e = new_vector_expr (e1->e.quaternion_val
|
||||
+ field->offset);
|
||||
return e;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -2172,13 +2209,9 @@ address_expr (expr_t *e1, expr_t *e2, type_t *t)
|
|||
def->used = 1;
|
||||
type = def->type;
|
||||
if (type->type == ev_struct || type->type == ev_class) {
|
||||
e = new_expr ();
|
||||
e = new_pointer_expr (0, t, def);
|
||||
e->line = e1->line;
|
||||
e->file = e1->file;
|
||||
e->type = ex_pointer;
|
||||
e->e.pointer.val = 0;
|
||||
e->e.pointer.type = t;
|
||||
e->e.pointer.def = def;
|
||||
} else if (type->type == ev_array) {
|
||||
e = e1;
|
||||
e->type = ex_pointer;
|
||||
|
|
|
@ -670,10 +670,6 @@ init_types (void)
|
|||
strct = quaternion_struct = get_struct (0, 1);
|
||||
init_struct (strct, new_type (), str_struct, 0);
|
||||
new_struct_field (strct, &type_float, "s", vis_public);
|
||||
new_struct_field (strct, &type_float, "x", vis_public);
|
||||
new_struct_field (strct, &type_float, "y", vis_public);
|
||||
new_struct_field (strct, &type_float, "z", vis_public);
|
||||
strct->size = 1; // evil hack for the vector access
|
||||
new_struct_field (strct, &type_vector, "v", vis_public);
|
||||
|
||||
strct = get_struct (0, 1);
|
||||
|
|
Loading…
Reference in a new issue