ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/mgflib/parser.c
(Generate patch)

Comparing ray/src/cv/mgflib/parser.c (file contents):
Revision 1.3 by greg, Wed Jun 22 17:15:49 1994 UTC vs.
Revision 1.4 by greg, Fri Jun 24 09:32:51 1994 UTC

# Line 53 | Line 53 | int    mg_nqcdivs = MG_NQCD;   /* number of divisions per q
53  
54   /* temporary settings for testing */
55   #define e_ies e_any_toss
56 + #define e_cmix e_any_toss
57 + #define e_cspec e_any_toss
58                                  /* alternate handler routines */
59  
60   static int      e_any_toss(),           /* discard unneeded entity */
61                  e_ies(),                /* IES luminaire file */
62                  e_include(),            /* include file */
63                  e_sph(),                /* sphere */
64 +                e_cmix(),               /* color mixtures */
65 +                e_cspec();              /* color spectra */
66                  e_cyl(),                /* cylinder */
67                  e_cone(),               /* cone */
68 +                e_prism(),              /* prism */
69                  e_ring(),               /* ring */
70                  e_torus();              /* torus */
71  
# Line 103 | Line 108 | mg_init()                      /* initialize alternate entity handlers */
108                  ineed |= 1<<MG_E_POINT|1<<MG_E_NORMAL|1<<MG_E_VERTEX;
109          } else
110                  uneed |= 1<<MG_E_POINT|1<<MG_E_NORMAL|1<<MG_E_VERTEX|1<<MG_E_XF;
111 +        if (mg_ehand[MG_E_PRISM] == NULL) {
112 +                mg_ehand[MG_E_PRISM] = e_prism;
113 +                ineed |= 1<<MG_E_POINT|1<<MG_E_VERTEX;
114 +        } else
115 +                uneed |= 1<<MG_E_POINT|1<<MG_E_VERTEX|1<<MG_E_XF;
116          if (mg_ehand[MG_E_TORUS] == NULL) {
117                  mg_ehand[MG_E_TORUS] = e_torus;
118                  ineed |= 1<<MG_E_POINT|1<<MG_E_NORMAL|1<<MG_E_VERTEX;
119          } else
120                  uneed |= 1<<MG_E_POINT|1<<MG_E_NORMAL|1<<MG_E_VERTEX|1<<MG_E_XF;
121 +        if (mg_ehand[MG_E_COLOR] != NULL) {
122 +                if (mg_ehand[MG_E_CMIX] == NULL)
123 +                        mg_ehand[MG_E_CMIX] = e_cmix;
124 +                if (mg_ehand[MG_E_CSPEC] == NULL)
125 +                        mg_ehand[MG_E_CSPEC] = e_cspec;
126 +        }
127                                          /* check for consistency */
128          if (mg_ehand[MG_E_FACE] != NULL)
129                  uneed |= 1<<MG_E_POINT|1<<MG_E_VERTEX|1<<MG_E_XF;
# Line 865 | Line 881 | char   **av;
881                          if ((rv = handle_it(MG_E_FACE, 5, fent)) != MG_OK)
882                                  return(rv);
883                  }
884 +        }
885 +        return(MG_OK);
886 + }
887 +
888 +
889 + static int
890 + e_prism(ac, av)                 /* turn a prism into polygons */
891 + int     ac;
892 + char    **av;
893 + {
894 +        static char     p[3][24];
895 +        static char     *vent[4] = {mg_ename[MG_E_VERTEX],NULL,"="};
896 +        static char     *pent[5] = {mg_ename[MG_E_POINT],p[0],p[1],p[2]};
897 +        char    *newav[MG_MAXARGC], nvn[MG_MAXARGC-1][8];
898 +        double  length;
899 +        FVECT   v1, v2, v3, norm;
900 +        register C_VERTEX       *cv;
901 +        C_VERTEX        *cv0;
902 +        int     rv;
903 +        register int    i, j;
904 +
905 +        if (ac < 5)
906 +                return(MG_EARGC);
907 +        if (!isflt(av[1]))
908 +                return(MG_ETYPE);
909 +        length = atof(av[1]);
910 +        if (length <= FTINY && length >= -FTINY)
911 +                return(MG_EILL);
912 +                                        /* do bottom face */
913 +        newav[0] = mg_ename[MG_E_FACE];
914 +        for (i = 1; i < ac-1; i++)
915 +                newav[i] = av[i+1];
916 +        newav[i] = NULL;
917 +        if ((rv = handle_it(MG_E_FACE, i, newav)) != MG_OK)
918 +                return(rv);
919 +                                        /* compute face normal */
920 +        if ((cv0 = c_getvert(av[2])) == NULL)
921 +                return(MG_EUNDEF);
922 +        norm[0] = norm[1] = norm[2] = 0.;
923 +        v1[0] = v1[1] = v1[2] = 0.;
924 +        for (i = 2; i < ac-1; i++) {
925 +                if ((cv = c_getvert(av[i+1])) == NULL)
926 +                        return(MG_EUNDEF);
927 +                v2[0] = cv->p[0] - cv0->p[0];
928 +                v2[1] = cv->p[1] - cv0->p[1];
929 +                v2[2] = cv->p[2] - cv0->p[2];
930 +                fcross(v3, v1, v2);
931 +                norm[0] += v3[0];
932 +                norm[1] += v3[1];
933 +                norm[2] += v3[2];
934 +                VCOPY(v1, v2);
935 +        }
936 +        if (normalize(norm) == 0.)
937 +                return(MG_EILL);
938 +                                        /* create moved vertices */
939 +        for (i = 1; i < ac-1; i++) {
940 +                sprintf(nvn[i-1], "_pv%d", i);
941 +                vent[1] = nvn[i-1];
942 +                if ((rv = handle_it(MG_E_VERTEX, 3, vent)) != MG_OK)
943 +                        return(rv);
944 +                cv = c_getvert(av[i+1]);        /* checked above */
945 +                for (j = 0; j < 3; j++)
946 +                        sprintf(p[j], FLTFMT, cv->p[j] - length*norm[j]);
947 +                if ((rv = handle_it(MG_E_POINT, 4, pent)) != MG_OK)
948 +                        return(rv);
949 +                newav[ac-1-i] = nvn[i-1];       /* reverse */
950 +        }
951 +                                                /* do top face */
952 +        if ((rv = handle_it(MG_E_FACE, ac-1, newav)) != MG_OK)
953 +                return(rv);
954 +                                                /* do the side faces */
955 +        newav[5] = NULL;
956 +        newav[3] = av[ac-1];
957 +        newav[4] = nvn[ac-3];
958 +        for (i = 1; i < ac-1; i++) {
959 +                newav[1] = nvn[i-1];
960 +                newav[2] = av[i+1];
961 +                if ((rv = handle_it(MG_E_FACE, 5, newav)) != MG_OK)
962 +                        return(rv);
963 +                newav[3] = newav[2];
964 +                newav[4] = newav[1];
965          }
966          return(MG_OK);
967   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines