Index: export_stl.c =================================================================== --- export_stl.c (revision 35995) +++ export_stl.c (revision 35996) @@ -318,6 +318,32 @@ }; RND_INLINE void v_transform(double dst[3], double src[3], double mx[16]); +static void stl_triangle_normal(double *dx, double *dy, double *dz, double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3) +{ + double len; + + *dx = (y2-y1)*(z3-z1) - (y3-y1)*(z2-z1); + *dy = (z2-z1)*(x3-x1) - (x2-x1)*(z3-z1); + *dz = (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1); + + len = sqrt((*dx) * (*dx) + (*dy) * (*dy) + (*dz) * (*dz)); + if (len == 0) return; + + *dx /= len; + *dy /= len; + *dz /= len; +} + +static void stl_facet_normal(stl_facet_t *t) +{ + stl_triangle_normal( + &t->n[0], &t->n[1], &t->n[2], + t->vx[0], t->vy[0], t->vz[0], + t->vx[1], t->vy[1], t->vz[1], + t->vx[2], t->vy[2], t->vz[2] + ); +} + #include "verthash.c" typedef struct { Index: model_load_amf.c =================================================================== --- model_load_amf.c (revision 35995) +++ model_load_amf.c (revision 35996) @@ -83,25 +83,6 @@ } } -static void stl_triangle_normal(stl_facet_t *t) -{ - double x1 = t->vx[0], y1 = t->vy[0], z1 = t->vz[0]; - double x2 = t->vx[1], y2 = t->vy[1], z2 = t->vz[1]; - double x3 = t->vx[2], y3 = t->vy[2], z3 = t->vz[2]; - double len; - - t->n[0] = (y2-y1)*(z3-z1) - (y3-y1)*(z2-z1); - t->n[1] = (z2-z1)*(x3-x1) - (x2-x1)*(z3-z1); - t->n[2] = (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1); - - len = sqrt(t->n[0] * t->n[0] + t->n[1] * t->n[1] + t->n[2] * t->n[2]); - if (len == 0) return; - - t->n[0] /= len; - t->n[1] /= len; - t->n[2] /= len; -} - static stl_facet_t *amf_load_volume(vtd0_t *verts, xmlNode *volume) { xmlNode *n, *m; @@ -135,7 +116,7 @@ t->vy[i] = crd[1]; t->vz[i] = crd[2]; } - stl_triangle_normal(t); + stl_facet_normal(t); if (tail != NULL) { tail->next = t;