From 7704d7a85fc2a3afe321ae4ba26bae502c92b9f0 Mon Sep 17 00:00:00 2001 From: "Mirar (Pontus Hagland)" <pike@sort.mirar.org> Date: Tue, 26 Oct 1999 18:07:40 +0200 Subject: [PATCH] ... Rev: src/modules/Math/math_matrix.c:1.8 --- src/modules/Math/math_matrix.c | 54 ++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/modules/Math/math_matrix.c b/src/modules/Math/math_matrix.c index af87d323a0..c9a84bb3a7 100644 --- a/src/modules/Math/math_matrix.c +++ b/src/modules/Math/math_matrix.c @@ -75,7 +75,8 @@ static void exit_matrix(struct object *o) **! method void create(int n,int m,string type) **! method void create(int n,int m,float|int init) **! method void create("identity",int size) -**! method void create("rotate",int size,float rads,int axis) +**! method void create("rotate",int size,float rads,Matrix axis) +**! method void create("rotate",int size,float rads,float x,float y,float z) **! **! This method initializes the matrix. **! It is illegal to create and hold an empty matrix. @@ -103,7 +104,7 @@ static void exit_matrix(struct object *o) static void matrix_create(INT32 args) { int ys=0,xs=0; - int i=0,j=0,k=0; + int i=0,j=0; FTYPE *m=NULL; if (!args) @@ -239,16 +240,31 @@ done_made: else if (sp[-args].u.string==s_rotate) { float r; - int axis; + float x,y,z; + float c,s; + struct matrix_storage *mx=NULL; - /* "rotate",size,degrees,axis */ + /* "rotate",size,degrees,x,y,z */ - get_all_args("matrix",args,"%s%i%F%i",&dummy,&side,&r,&axis); + if (args>3 && sp[3-args].type==T_OBJECT && + ((mx=(struct matrix_storage*) + get_storage(sp[-1].u.object,math_matrix_program)))) + { + if (mx->xsize*mx->ysize!=3) + SIMPLE_BAD_ARG_ERROR("matrix",4,"Matrix of size 1x3 or 3x1"); + + x=mx->m[0]; + y=mx->m[1]; + z=mx->m[2]; + + get_all_args("matrix",args,"%s%i%F",&dummy,&side,&r); + } + else + get_all_args("matrix",args,"%s%i%F%F%F%F", + &dummy,&side,&r,&x,&y,&z); if (side<2) SIMPLE_BAD_ARG_ERROR("matrix",2,"int(2..)"); - if (side==2 && axis!=2) - SIMPLE_BAD_ARG_ERROR("matrix",3,"int(2..2)"); THIS->xsize=THIS->ysize=side; THIS->m=m=malloc(sizeof(FTYPE)*side*side); @@ -256,15 +272,23 @@ done_made: n=side*side; while (n--) *(m++)=0.0; - for (n=0; i<side; i++) + for (n=3; i<side; i++) THIS->m[i*(side+1)]=1.0; - if (axis==0) j=1; - k=j+1; - while (k==axis) k++; - THIS->m[j+j*side]=cos(r); - THIS->m[k+j*side]=-sin(r); - THIS->m[j+k*side]=sin(r); - THIS->m[k+k*side]=cos(r); + c=cos(r); + s=sin(r); + + THIS->m[0+0*side]=x*x*(1-c)+c; + THIS->m[1+0*side]=x*y*(1-c)-z*s; + THIS->m[0+1*side]=y*x*(1-c)+z*s; + THIS->m[1+1*side]=y*y*(1-c)+c; + if (side>2) + { + THIS->m[2+0*side]=x*z*(1-c)+y*s; + THIS->m[2+1*side]=y*z*(1-c)-x*s; + THIS->m[0+2*side]=z*x*(1-c)-y*s; + THIS->m[1+2*side]=z*y*(1-c)+x*s; + THIS->m[2+2*side]=z*z*(1-c)+c; + } } else SIMPLE_BAD_ARG_ERROR("matrix",1, -- GitLab