Ok i came out with... this is not a fix, it is more of a hack, too make it work. There are unaligned calls all over the place even after doing this, but the CPU is dealing and fixing those by itself. This may not be true with EVERY ARM cpu out there or with every model.

This "hack" involves in modifing 2 functions.

point_in_octant in modeloctant.cpp:25

`// returns 1 if a point is in an octant.`

int point_in_octant( polymodel * pm, model_octant * oct, vec3d *vert )

{

vec3d *avert;

avert= (vec3d*)vm_malloc(sizeof(vec3d));

memcpy(avert, vert, sizeof(vec3d));

if ( avert->xyz.x < oct->min.xyz.x ) free(avert);return 0;

if ( avert->xyz.x > oct->max.xyz.x ) free(avert);return 0;

if ( avert->xyz.y < oct->min.xyz.y ) free(avert);return 0;

if ( avert->xyz.y > oct->max.xyz.y ) free(avert);return 0;

if ( avert->xyz.z < oct->min.xyz.z) free(avert);return 0;

if ( avert->xyz.z > oct->max.xyz.z) free(avert);return 0;

free(avert);

return 1;

}

fvi_ray_boundingbox in fvi.cpp:326

`int fvi_ray_boundingbox( vec3d *min, vec3d *max, vec3d * p0, vec3d *pdir, vec3d *hitpt )`

{

int middle = ((1<<0) | (1<<1) | (1<<2));

int i;

int which_plane;

float maxt[3];

float candidate_plane[3];

vec3d *ap0, *amin, *amax;

ap0= (vec3d*)vm_malloc(sizeof(vec3d));

memcpy(ap0, p0, sizeof(vec3d));

amin= (vec3d*)vm_malloc(sizeof(vec3d));

memcpy(amin, min, sizeof(vec3d));

amax= (vec3d*)vm_malloc(sizeof(vec3d));

memcpy(amax, max, sizeof(vec3d));

for (i = 0; i < 3; i++) {

if (ap0->a1d[i] < amin->a1d[i]) {

candidate_plane[i] = amin->a1d[i];

middle &= ~(1<<i);

} else if (ap0->a1d[i] > amax->a1d[i]) {

candidate_plane[i] = amax->a1d[i];

middle &= ~(1<<i);

}

}

// ray origin inside bounding box?

// (are all three bits still set?)

if (middle == ((1<<0) | (1<<1) | (1<<2))) {

*hitpt = *ap0;

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 1;

}

// calculate T distances to candidate plane

for (i = 0; i < 3; i++) {

if ( (middle & (1<<i)) || (pdir->a1d[i] == 0.0f) ) {

maxt[i] = -1.0f;

} else {

maxt[i] = (candidateint fvi_ray_boundingbox( vec3d *min, vec3d *max, vec3d * p0, vec3d *pdir, vec3d *hitpt )

{

int middle = ((1<<0) | (1<<1) | (1<<2));

int i;

int which_plane;

float maxt[3];

float candidate_plane[3];

vec3d *ap0, *amin, *amax;

ap0= (vec3d*)vm_malloc(sizeof(vec3d));

memcpy(ap0, p0, sizeof(vec3d));

amin= (vec3d*)vm_malloc(sizeof(vec3d));

memcpy(amin, min, sizeof(vec3d));

amax= (vec3d*)vm_malloc(sizeof(vec3d));

memcpy(amax, max, sizeof(vec3d));

for (i = 0; i < 3; i++) {

if (ap0->a1d[i] < amin->a1d[i]) {

candidate_plane[i] = amin->a1d[i];

middle &= ~(1<<i);

} else if (ap0->a1d[i] > amax->a1d[i]) {

candidate_plane[i] = amax->a1d[i];

middle &= ~(1<<i);

}

}

// ray origin inside bounding box?

// (are all three bits still set?)

if (middle == ((1<<0) | (1<<1) | (1<<2))) {

*hitpt = *ap0;

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 1;

}

// calculate T distances to candidate plane

for (i = 0; i < 3; i++) {

if ( (middle & (1<<i)) || (pdir->a1d[i] == 0.0f) ) {

maxt[i] = -1.0f;

} else {

maxt[i] = (candidate_plane[i] - ap0->a1d[i]) / pdir->a1d[i];

}

}

// Get largest of the maxt's for final choice of intersection

which_plane = 0;

for (i = 1; i < 3; i++) {

if (maxt[which_plane] < maxt[i]) {

which_plane = i;

}

}

// check final candidate actually inside box

if (maxt[which_plane] < 0.0f) {

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 0;

}

for (i = 0; i < 3; i++) {

if (which_plane == i) {

hitpt->a1d[i] = candidate_plane[i];

} else {

hitpt->a1d[i] = (maxt[which_plane] * pdir->a1d[i]) + ap0->a1d[i];

if ( (hitpt->a1d[i] < amin->a1d[i]) || (hitpt->a1d[i] > amax->a1d[i]) ) {

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 0;

}

}

}

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 1;

}_plane[i] - ap0->a1d[i]) / pdir->a1d[i];

}

}

// Get largest of the maxt's for final choice of intersection

which_plane = 0;

for (i = 1; i < 3; i++) {

if (maxt[which_plane] < maxt[i]) {

which_plane = i;

}

}

// check final candidate actually inside box

if (maxt[which_plane] < 0.0f) {

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 0;

}

for (i = 0; i < 3; i++) {

if (which_plane == i) {

hitpt->a1d[i] = candidate_plane[i];

} else {

hitpt->a1d[i] = (maxt[which_plane] * pdir->a1d[i]) + ap0->a1d[i];

if ( (hitpt->a1d[i] < amin->a1d[i]) || (hitpt->a1d[i] > amax->a1d[i]) ) {

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 0;

}

}

}

vm_free(ap0);

vm_free(amin);

vm_free(amax);

return 1;

}

I keep testing this, i already finished the first 2 missions of Wing Commander Saga on the Raspberry PI with this. I also tested Dispora and it seems to work as well.

EDIT: Unfortunately, this only works with Debug build.

`Thread 1 "fs2_open_3.7.2" received signal SIGBUS, Bus error.`

0x0023f7f0 in model_collide_parse_bsp(bsp_collision_tree*, void*, int)

modelcollide.cpp:729

BTW, the 3.7.2 is not on git? i see the 3.7.0, but not the 3.7.2, ill like to fork and add changes on 3.7.2 for Raspberry PI users.