| 135 |
|
if (mg_ehand[MG_E_RD] != NULL || mg_ehand[MG_E_TD] != NULL || |
| 136 |
|
mg_ehand[MG_E_ED] != NULL || |
| 137 |
|
mg_ehand[MG_E_RS] != NULL || |
| 138 |
< |
mg_ehand[MG_E_TS] != NULL) |
| 138 |
> |
mg_ehand[MG_E_TS] != NULL || |
| 139 |
> |
mg_ehand[MG_E_SIDES] != NULL) |
| 140 |
|
uneed |= 1<<MG_E_MATERIAL; |
| 141 |
|
for (i = 0; i < MG_NENTITIES; i++) |
| 142 |
|
if (uneed & 1<<i && mg_ehand[i] == NULL) { |
| 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 */ |
| 886 |
< |
newav[0] = mg_ename[MG_E_FACE]; |
| 887 |
< |
for (i = 1; i < ac-1; i++) |
| 888 |
< |
newav[i] = av[i]; |
| 889 |
< |
newav[i] = NULL; |
| 890 |
< |
if ((rv = mg_handle(MG_E_FACE, i, newav)) != MG_OK) |
| 891 |
< |
return(rv); |
| 892 |
< |
/* 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); |
| 922 |
– |
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) |
| 926 |
< |
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 |
|
|