866 |
|
char **av; |
867 |
|
{ |
868 |
|
static char p[3][24]; |
869 |
< |
static char *vent[4] = {mg_ename[MG_E_VERTEX],NULL,"="}; |
869 |
> |
static char *vent[5] = {mg_ename[MG_E_VERTEX],NULL,"="}; |
870 |
|
static char *pent[5] = {mg_ename[MG_E_POINT],p[0],p[1],p[2]}; |
871 |
+ |
static char *znorm[5] = {mg_ename[MG_E_NORMAL],"0","0","0"}; |
872 |
|
char *newav[MG_MAXARGC], nvn[MG_MAXARGC-1][8]; |
873 |
|
double length; |
874 |
+ |
int hasnorm; |
875 |
|
FVECT v1, v2, v3, norm; |
876 |
|
register C_VERTEX *cv; |
877 |
|
C_VERTEX *cv0; |
878 |
|
int rv; |
879 |
|
register int i, j; |
880 |
< |
|
880 |
> |
/* check arguments */ |
881 |
|
if (ac < 5) |
882 |
|
return(MG_EARGC); |
883 |
|
if (!isflt(av[ac-1])) |
885 |
|
length = atof(av[ac-1]); |
886 |
|
if (length <= FTINY && length >= -FTINY) |
887 |
|
return(MG_EILL); |
888 |
< |
/* do bottom face */ |
887 |
< |
newav[0] = mg_ename[MG_E_FACE]; |
888 |
< |
for (i = 1; i < ac-1; i++) |
889 |
< |
newav[i] = av[i]; |
890 |
< |
newav[i] = NULL; |
891 |
< |
if ((rv = mg_handle(MG_E_FACE, i, newav)) != MG_OK) |
892 |
< |
return(rv); |
893 |
< |
/* compute face normal */ |
888 |
> |
/* compute face normal */ |
889 |
|
if ((cv0 = c_getvert(av[1])) == NULL) |
890 |
|
return(MG_EUNDEF); |
891 |
+ |
hasnorm = 0; |
892 |
|
norm[0] = norm[1] = norm[2] = 0.; |
893 |
|
v1[0] = v1[1] = v1[2] = 0.; |
894 |
|
for (i = 2; i < ac-1; i++) { |
895 |
|
if ((cv = c_getvert(av[i])) == NULL) |
896 |
|
return(MG_EUNDEF); |
897 |
+ |
hasnorm += !is0vect(cv->n); |
898 |
|
v2[0] = cv->p[0] - cv0->p[0]; |
899 |
|
v2[1] = cv->p[1] - cv0->p[1]; |
900 |
|
v2[2] = cv->p[2] - cv0->p[2]; |
906 |
|
} |
907 |
|
if (normalize(norm) == 0.) |
908 |
|
return(MG_EILL); |
909 |
< |
/* create moved vertices */ |
909 |
> |
/* create moved vertices */ |
910 |
|
for (i = 1; i < ac-1; i++) { |
911 |
|
sprintf(nvn[i-1], "_pv%d", i); |
912 |
|
vent[1] = nvn[i-1]; |
913 |
< |
if ((rv = mg_handle(MG_E_VERTEX, 3, vent)) != MG_OK) |
913 |
> |
vent[3] = av[i]; |
914 |
> |
if ((rv = mg_handle(MG_E_VERTEX, 4, vent)) != MG_OK) |
915 |
|
return(rv); |
916 |
|
cv = c_getvert(av[i]); /* checked above */ |
917 |
|
for (j = 0; j < 3; j++) |
918 |
|
sprintf(p[j], FLTFMT, cv->p[j] - length*norm[j]); |
919 |
|
if ((rv = mg_handle(MG_E_POINT, 4, pent)) != MG_OK) |
920 |
|
return(rv); |
923 |
– |
newav[ac-1-i] = nvn[i-1]; /* reverse */ |
921 |
|
} |
922 |
< |
/* do top face */ |
923 |
< |
if ((rv = mg_handle(MG_E_FACE, ac-1, newav)) != MG_OK) |
927 |
< |
return(rv); |
922 |
> |
/* make faces */ |
923 |
> |
newav[0] = mg_ename[MG_E_FACE]; |
924 |
|
/* do the side faces */ |
925 |
|
newav[5] = NULL; |
926 |
|
newav[3] = av[ac-2]; |
933 |
|
newav[3] = newav[2]; |
934 |
|
newav[4] = newav[1]; |
935 |
|
} |
936 |
+ |
/* do top face */ |
937 |
+ |
for (i = 1; i < ac-1; i++) { |
938 |
+ |
if (hasnorm) { /* zero normals */ |
939 |
+ |
vent[1] = nvn[i-1]; |
940 |
+ |
if ((rv = mg_handle(MG_E_VERTEX, 2, vent)) != MG_OK) |
941 |
+ |
return(rv); |
942 |
+ |
if ((rv = mg_handle(MG_E_NORMAL, 4, znorm)) != MG_OK) |
943 |
+ |
return(rv); |
944 |
+ |
} |
945 |
+ |
newav[ac-1-i] = nvn[i-1]; /* reverse */ |
946 |
+ |
} |
947 |
+ |
if ((rv = mg_handle(MG_E_FACE, ac-1, newav)) != MG_OK) |
948 |
+ |
return(rv); |
949 |
+ |
/* do bottom face */ |
950 |
+ |
if (hasnorm) |
951 |
+ |
for (i = 1; i < ac-1; i++) { |
952 |
+ |
vent[1] = nvn[i-1]; |
953 |
+ |
vent[3] = av[i]; |
954 |
+ |
if ((rv = mg_handle(MG_E_VERTEX, 4, vent)) != MG_OK) |
955 |
+ |
return(rv); |
956 |
+ |
if ((rv = mg_handle(MG_E_NORMAL, 4, znorm)) != MG_OK) |
957 |
+ |
return(rv); |
958 |
+ |
newav[i] = nvn[i-1]; |
959 |
+ |
} |
960 |
+ |
else |
961 |
+ |
for (i = 1; i < ac-1; i++) |
962 |
+ |
newav[i] = av[i]; |
963 |
+ |
newav[i] = NULL; |
964 |
+ |
if ((rv = mg_handle(MG_E_FACE, i, newav)) != MG_OK) |
965 |
+ |
return(rv); |
966 |
|
return(MG_OK); |
967 |
|
} |
968 |
|
|