home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / rayce27s / spd.dif < prev    next >
Encoding:
Text File  |  1994-01-13  |  17.7 KB  |  588 lines

  1. *** old\showdxf.c    Tue Sep  7 16:48:38 1993
  2. --- showdxf.c    Sat Jan  8 18:27:40 1994
  3. ***************
  4. *** 235,240 ****
  5. --- 235,241 ----
  6.       fprintf(stderr, "    9   PLG format for use with rend386\n");
  7.       fprintf(stderr, "    10  Raw triangle output\n");
  8.       fprintf(stderr, "    11  art 2.3\n");
  9. +     fprintf(stderr, "    12  Rayce 2.7\n");
  10.   
  11.   #endif
  12.   } /* showdxf_usage */
  13. *** old\lib.h    Mon Sep  6 19:13:42 1993
  14. --- lib.h    Fri Jan  7 10:10:08 1994
  15. ***************
  16. *** 26,31 ****
  17. --- 26,36 ----
  18.    *           Eduard [esp] Schwan
  19.    *           Copied comments from lib.c into here for "documenting"
  20.    *           the calls a little better.
  21. +  *
  22. +  * Modified: 6 January 1994
  23. +  *           Shawn McHorse
  24. +  *           Added support for Rayce 2.7
  25. +  *
  26.    */
  27.   #ifndef LIB_H
  28.   #define LIB_H
  29. ***************
  30. *** 39,45 ****
  31.   
  32.   /* ------- The version of this Library, see lib_get_version_str() -------- */
  33.   
  34. ! #define LIB_VERSION    "3.1a"
  35.   
  36.   /* Raytracers supported by this package (default OUTPUT_POVRAY): */
  37.   
  38. --- 44,50 ----
  39.   
  40.   /* ------- The version of this Library, see lib_get_version_str() -------- */
  41.   
  42. ! #define LIB_VERSION    "3.1b"
  43.   
  44.   /* Raytracers supported by this package (default OUTPUT_POVRAY): */
  45.   
  46. ***************
  47. *** 58,64 ****
  48.   #define OUTPUT_PLG        9 /* PLG format for use with "rend386"           */
  49.   #define OUTPUT_RAWTRI    10 /* Raw triangle output                         */
  50.   #define OUTPUT_ART       11 /* Art 2.3                                     */
  51. ! #define OUTPUT_DELAYED   12 /* Needed for RTRACE/PLG output.
  52.                      When this is used, all definitions will be
  53.                      stored rather than immediately dumped.  When
  54.                      all definitions are complete, use the call
  55. --- 63,70 ----
  56.   #define OUTPUT_PLG        9 /* PLG format for use with "rend386"           */
  57.   #define OUTPUT_RAWTRI    10 /* Raw triangle output                         */
  58.   #define OUTPUT_ART       11 /* Art 2.3                                     */
  59. ! #define OUTPUT_RAYCE     12 /* Rayce 2.7                                   */
  60. ! #define OUTPUT_DELAYED   13 /* Needed for RTRACE/PLG output.
  61.                      When this is used, all definitions will be
  62.                      stored rather than immediately dumped.  When
  63.                      all definitions are complete, use the call
  64. ***************
  65. *** 65,71 ****
  66.                      "lib_flush_definitions" to spit them all out. */
  67.   
  68.   /* Default setting of output RT type - change to your favorite & recompile */
  69. ! #define OUTPUT_RT_DEFAULT   OUTPUT_NFF
  70.   
  71.   /* Sets raw triangle output format to include texture */
  72.   #define RAWTRI_WITH_TEXTURES    0    /* set to 1 to include texture */
  73. --- 71,77 ----
  74.                      "lib_flush_definitions" to spit them all out. */
  75.   
  76.   /* Default setting of output RT type - change to your favorite & recompile */
  77. ! #define OUTPUT_RT_DEFAULT   OUTPUT_RAYCE
  78.   
  79.   /* Sets raw triangle output format to include texture */
  80.   #define RAWTRI_WITH_TEXTURES    0    /* set to 1 to include texture */
  81. ***************
  82. *** 216,221 ****
  83. --- 222,228 ----
  84.    *    9   PLG format for use with "rend386"
  85.    *    10  Raw triangle output
  86.    *    11  art 2.3
  87. +  *    12  Rayce 2.7
  88.    * -c - output true curved descriptions
  89.    * -t - output tessellated triangle descriptions
  90.    * -f file - output filename (used for showdxf.c only)
  91. *** old\lib.c    Tue Sep  7 16:42:16 1993
  92. --- lib.c    Sun Jan  9 07:16:12 1994
  93. ***************
  94. *** 74,79 ****
  95. --- 74,84 ----
  96.    *           Eric Haines
  97.    *           Created standardized lib_open/lib_close functions
  98.    *           Renamed lib_initialize/lib_shutdown to lib_storage_*
  99. +  *
  100. +  * Modified: 6 January 1994
  101. +  *           Shawn McHorse
  102. +  *           Added support for Rayce 2.7
  103. +  *
  104.    */
  105.   
  106.   /*-----------------------------------------------------------------*/
  107. ***************
  108. *** 166,171 ****
  109. --- 171,177 ----
  110.       fprintf(stderr, "    9   PLG format for use with rend386\n");
  111.       fprintf(stderr, "    10  Raw triangle output\n");
  112.       fprintf(stderr, "    11  art 2.3\n");
  113. +     fprintf(stderr, "    12  Rayce 2.7\n");
  114.       fprintf(stderr, "-c - output true curved descriptions\n");
  115.       fprintf(stderr, "-t - output tessellated triangle descriptions\n");
  116.   
  117. ***************
  118. *** 191,196 ****
  119. --- 197,203 ----
  120.    *    9   PLG format for use with "rend386"
  121.    *    10  Raw triangle output
  122.    *    11  art 2.3
  123. +  *    12  Rayce 2.7
  124.    * -c - output true curved descriptions
  125.    * -t - output tessellated triangle descriptions
  126.    * -f file - DXF file to convert/display (used for showdxf.c only)
  127. ***************
  128. *** 694,699 ****
  129. --- 701,726 ----
  130.           fprintf(outfile, "\n");
  131.           break;
  132.   
  133. +     case OUTPUT_RAYCE:
  134. +         tab_indent();
  135. +         fprintf(outfile, "camera {\n");
  136. +         tab_inc();
  137. +         tab_indent();
  138. +         fprintf(outfile, "location <%g, %g, %g>\n",
  139. +             from[X], from[Y], from[Z]);
  140. +         tab_indent();
  141. +         fprintf(outfile, "look_at <%g, %g, %g>\n", at[X], at[Y], at[Z]);
  142. +         tab_indent();
  143. +         fprintf(outfile, "sky <%g, %g, %g>\n", up[X], up[Y], up[Z]);
  144. +         tab_indent();
  145. +         fprintf(outfile, "aspect %g\n", aspect_ratio);
  146. +         tab_indent();
  147. +         fprintf(outfile, "fov %g\n", fov_angle);
  148. +         tab_dec();
  149. +         tab_indent();
  150. +         fprintf(outfile, "} /* camera */\n\n");
  151. +         break;
  152.       case OUTPUT_RAWTRI:
  153.           break;
  154.       }
  155. ***************
  156. *** 834,839 ****
  157. --- 861,872 ----
  158.           fprintf(outfile, "\n");
  159.           break;
  160.   
  161. +     case OUTPUT_RAYCE:
  162. +         tab_indent();
  163. +         fprintf(outfile, "light_source { <%g, %g, %g> color rgb <%g, %g, %g> }\n\n",
  164. +             center_pt[X], center_pt[Y], center_pt[Z], lscale, lscale, lscale);
  165. +         break;
  166.       case OUTPUT_RAWTRI:
  167.           break;
  168.       }
  169. ***************
  170. *** 922,930 ****
  171.           fprintf(outfile, "0 0 0\n");
  172.           break;
  173.   
  174. -     case OUTPUT_RAWTRI:
  175. -         break;
  176.       case OUTPUT_ART:
  177.           tab_indent();
  178.           fprintf(outfile, "background %g, %g, %g\n",
  179. --- 955,960 ----
  180. ***************
  181. *** 931,936 ****
  182. --- 961,975 ----
  183.               color[X], color[Y], color[Z]);
  184.           fprintf(outfile, "\n");
  185.           break;
  186. +     case OUTPUT_RAYCE:
  187. +         tab_indent();
  188. +         fprintf(outfile, "options { background color rgb <%g, %g, %g> }\n\n",
  189. +             color[X], color[Y], color[Z]);
  190. +         break;
  191. +        case OUTPUT_RAWTRI:
  192. +         break;
  193.       }
  194.   }
  195.   
  196. ***************
  197. *** 1327,1332 ****
  198. --- 1366,1410 ----
  199.           fprintf(outfile, "transparency %f\n", kt);
  200.           fprintf(outfile, "\n");
  201.           break;
  202. +     case OUTPUT_RAYCE:
  203. +         txname = create_surface_name(name, texture_count);
  204. +         tab_indent();
  205. +         fprintf(outfile, "#declare %s = texture {\n", txname);
  206. +         tab_inc();
  207. +         if (ka != 0) {
  208. +         tab_indent();
  209. +         fprintf(outfile, "ambient color rgb <%g, %g, %g>\n",
  210. +             ka*color[X], ka*color[Y], ka*color[Z]);
  211. +         }
  212. +         if (kd != 0) {
  213. +         tab_indent();
  214. +         fprintf(outfile, "diffuse color rgb <%g, %g, %g>\n",
  215. +             kd*color[X], kd*color[Y], kd*color[Z]);
  216. +         }
  217. +         if (shine != 0) {
  218. +         tab_indent();
  219. +         if (shine > 1.0) shine = 1.0;
  220. +         fprintf(outfile, "specular color rgb <%g, %g, %g>\n",
  221. +             shine*color[X], shine*color[Y], shine*color[Z]);
  222. +         }
  223. +         if (ks != 0) {
  224. +         tab_indent();
  225. +         fprintf(outfile, "reflection color rgb <%g, %g, %g>\n",
  226. +             ks*color[X], ks*color[Y], ks*color[Z]);
  227. +         }
  228. +         if (kt != 0) {
  229. +         tab_indent();
  230. +         fprintf(outfile, "refraction color rgb <%g, %g, %g>\n",
  231. +             kt*color[X], kt*color[Y], kt*color[Z]);
  232. +         tab_indent();
  233. +         fprintf(outfile, "ior %g\n", i_of_r);
  234. +         }
  235. +         tab_dec();
  236. +         tab_indent();
  237. +         fprintf(outfile, "} /* texture %s */\n\n", txname);
  238. +         break;
  239.       }
  240.   
  241.       /* Stash away the current texture name */
  242. ***************
  243. *** 1680,1685 ****
  244. --- 1758,1838 ----
  245.           fprintf(outfile, "\n");
  246.           break;
  247.   
  248. +         case OUTPUT_RAYCE:
  249. +         if (apex_pt[W] < base_pt[W]) {
  250. +             /* Put the bigger end at the top */
  251. +             COPY_COORD4(axis, base_pt);
  252. +             COPY_COORD4(base_pt, apex_pt);
  253. +             COPY_COORD4(apex_pt, axis);
  254. +             }
  255. +         /* Find the axis and axis length */
  256. +         SUB3_COORD3(axis, apex_pt, base_pt);
  257. +         len = lib_normalize_vector(axis);
  258. +         if (len < EPSILON) {
  259. +            /* Degenerate cone/cylinder */
  260. +            fprintf(outfile, "/* degenerate cone/cylinder!  Ignored... */\n");
  261. +            break;
  262. +            }
  263. +         if (ABSOLUTE(apex_pt[W] - base_pt[W]) < EPSILON) {
  264. +            /* Treat this thing as a cylinder */
  265. +            tab_indent();
  266. +            fprintf(outfile, "object { cylinder { <%g, %g, %g>, <%g, %g, %g>, %g } ",
  267. +                 base_pt[X], base_pt[Y], base_pt[Z],
  268. +                 apex_pt[X], apex_pt[Y], apex_pt[Z], base_pt[W]);
  269. +            if (texture_name != NULL)
  270. +              fprintf(outfile, "texture { %s } ", texture_name);
  271. +            fprintf(outfile, "}\n\n");
  272. +         } else {
  273. +            /* Determine alignment */
  274. +            cottheta = len / (apex_pt[W] - base_pt[W]);
  275. +            tab_indent();
  276. +            fprintf(outfile, "object {\n");
  277. +            tab_inc();
  278. +            tab_indent();
  279. +            fprintf(outfile, "quadric{ <1, 1, -1>, <0, 0, 0>, <0, 0, 0>, 0 } /* cone */\n");
  280. +            if (texture_name != NULL) {
  281. +            tab_indent();
  282. +            fprintf(outfile, "texture { %s }\n", texture_name);
  283. +            }
  284. +            tab_indent();
  285. +            fprintf(outfile, "clipped_by {\n");
  286. +            tab_inc();
  287. +            tab_indent();
  288. +            fprintf(outfile, "intersection {\n");
  289. +            tab_inc();
  290. +            tab_indent();
  291. +            fprintf(outfile, "plane { <0, 0, -1>, %g}\n", -base_pt[W]);
  292. +            tab_indent();
  293. +            fprintf(outfile, "plane { <0, 0, 1>, %g}\n", apex_pt[W]);
  294. +            tab_dec();
  295. +            tab_indent();
  296. +            fprintf(outfile, "} /* intersection */\n");
  297. +            tab_dec();
  298. +            tab_indent();
  299. +            fprintf(outfile, "} /* clip */\n");
  300. +            tab_indent();
  301. +            fprintf(outfile, "translate <0, 0, %g>\n", -base_pt[W]);
  302. +               tab_indent();
  303. +            fprintf(outfile, "scale <1, 1, %g>\n", cottheta);
  304. +            len = sqrt(axis[X] * axis[X] + axis[Z] * axis[Z]);
  305. +            xang = -180.0 * asin(axis[Y]) / PI;
  306. +            if (len < EPSILON)
  307. +              yang = 0.0;
  308. +            else
  309. +              yang = 180.0 * acos(axis[Z] / len) / PI;
  310. +            if (axis[X] < 0)
  311. +                yang = -yang;
  312. +            tab_indent();
  313. +            fprintf(outfile, "rotate <%g, %g, 0>\n", xang, yang);
  314. +            tab_indent();
  315. +            fprintf(outfile, "translate <%g, %g, %g>\n",
  316. +                base_pt[X], base_pt[Y], base_pt[Z]);
  317. +            tab_dec();
  318. +            tab_indent();
  319. +            fprintf(outfile, "} /* cone */\n\n");
  320. +          }
  321. +         break;
  322.           case OUTPUT_RAWTRI:
  323.           lib_output_polygon_cylcone(base_pt, apex_pt);
  324.           break;
  325. ***************
  326. *** 1885,1890 ****
  327. --- 2038,2098 ----
  328.           apex[W] = oradius;
  329.           lib_output_cylcone(base, apex, curve_format);
  330.           break;
  331. +         case OUTPUT_RAYCE:
  332. +         /* A disc is a plane intersected with either one or two
  333. +          * spheres
  334. +          */
  335. +         COPY_COORD3(axis, normal);
  336. +         len = lib_normalize_vector(axis);
  337. +         tab_indent();
  338. +         fprintf(outfile, "object {\n");
  339. +         tab_inc();
  340. +         tab_indent();
  341. +         fprintf(outfile, "plane { <0, 0, 1>, 1 }\n");
  342. +         if (texture_name != NULL) {
  343. +         tab_indent();
  344. +         fprintf(outfile, "texture { %s }", texture_name);
  345. +         }
  346. +         tab_indent();
  347. +         fprintf(outfile, "clipped_by {\n");
  348. +         tab_inc();
  349. +         if (iradius > 0.0) {
  350. +             tab_indent();
  351. +             fprintf(outfile, "intersection {\n");
  352. +             tab_inc();
  353. +             tab_indent();
  354. +             fprintf(outfile, "sphere { <0, 0, 0>, %g inverse }\n",
  355. +                 iradius);
  356. +             tab_indent();
  357. +             fprintf(outfile, "sphere { <0, 0, 1>, %g }\n", oradius);
  358. +             tab_dec();
  359. +             tab_indent();
  360. +             fprintf(outfile, "} /* intersection */\n");
  361. +         }
  362. +         else {
  363. +             tab_indent();
  364. +             fprintf(outfile, "object { sphere { <0, 0, 0>, %g } }\n",
  365. +                 oradius);
  366. +         }
  367. +         tab_dec();
  368. +         tab_indent();
  369. +         fprintf(outfile, "} /* clip */\n");
  370. +         len = sqrt(axis[X] * axis[X] + axis[Z] * axis[Z]);
  371. +         xang = -180.0 * asin(axis[Y]) / PI;
  372. +         yang = 180.0 * acos(axis[Z] / len) / PI;
  373. +         if (axis[X] < 0)
  374. +             yang = -yang;
  375. +         tab_indent();
  376. +         fprintf(outfile, "rotate <%g, %g, 0>\n", xang, yang);
  377. +         tab_indent();
  378. +         fprintf(outfile, "translate <%g, %g, %g>\n",
  379. +             center[X], center[Y], center[Z]);
  380. +         tab_dec();
  381. +         tab_indent();
  382. +         fprintf(outfile, "} /* object - disc */\n\n");
  383. +         break;
  384.       }
  385.       } else {
  386.       lib_output_polygon_disc(center, normal, iradius, oradius);
  387. ***************
  388. *** 2258,2263 ****
  389. --- 2466,2480 ----
  390.           fprintf(outfile, "\n");
  391.           break;
  392.   
  393. +         case OUTPUT_RAYCE:
  394. +         tab_indent();
  395. +         fprintf(outfile, "object { sphere { <%g, %g, %g>, %g }",
  396. +             center_pt[X], center_pt[Y], center_pt[Z], center_pt[W]);
  397. +         if (texture_name != NULL)
  398. +             fprintf(outfile, " texture { %s }", texture_name);
  399. +         fprintf(outfile, " }\n\n");
  400. +         break;
  401.           case OUTPUT_RAWTRI:
  402.           lib_output_polygon_sphere(center_pt);
  403.           break;
  404. ***************
  405. *** 2415,2420 ****
  406. --- 2632,2638 ----
  407.           case OUTPUT_QRT:
  408.           case OUTPUT_RTRACE:
  409.           case OUTPUT_VIVID:
  410. +         case OUTPUT_RAYCE:
  411.           case OUTPUT_RAWTRI:
  412.           lib_output_polygon_height(height, width, data,
  413.                         x0, x1, y0, y1, z0, z1);
  414. ***************
  415. *** 2696,2701 ****
  416. --- 2914,2960 ----
  417.           fprintf(outfile, "}\n");
  418.           fprintf(outfile, "\n");
  419.           break;
  420. +         case OUTPUT_RAYCE:
  421. +         /*
  422. +          A torus object lies in the x-y plane.  We need to determine
  423. +          the angles of rotation to get it lined up with "normal".
  424. +          */
  425. +         tab_indent();
  426. +         fprintf(outfile, "object {\n");
  427. +         tab_inc();
  428. +         tab_indent();
  429. +         fprintf(outfile, "torus { %g, %g }\n", iradius, oradius);
  430. +         (void)lib_normalize_vector(normal);
  431. +         len = sqrt(normal[X] * normal[X] + normal[Y] * normal[Y]);
  432. +         xang = 180.0 * asin(normal[Z]) / PI + 90.0;
  433. +         if (len < EPSILON)
  434. +             zang = 0.0;
  435. +         else
  436. +             zang = -180.0 * acos(normal[Y] / len) / PI;
  437. +         if (normal[X] < 0)
  438. +             zang = -zang;
  439. +         if (ABSOLUTE(xang) > EPSILON || ABSOLUTE(zang) > EPSILON) {
  440. +             tab_indent();
  441. +             fprintf(outfile, "rotate <%g, 0, %g>\n", xang, zang);
  442. +         }
  443. +         if (ABSOLUTE(center[X]) > EPSILON ||
  444. +             ABSOLUTE(center[Y]) > EPSILON ||
  445. +             ABSOLUTE(center[Z]) > EPSILON) {
  446. +             tab_indent();
  447. +             fprintf(outfile, "translate <%g, %g, %g>\n",
  448. +                 center[X], center[Y], center[Z]);
  449. +         }
  450. +         if (texture_name != NULL) {
  451. +             tab_indent();
  452. +             fprintf(outfile, "texture { %s }", texture_name);
  453. +         }
  454. +         fprintf(outfile, "\n");
  455. +         tab_dec();
  456. +         tab_indent();
  457. +         fprintf(outfile, "} // torus\n");
  458. +         fprintf(outfile, "\n");
  459. +         break;
  460.       }
  461.       } else {
  462.       lib_output_polygon_torus(center, normal, iradius, oradius);
  463. ***************
  464. *** 2846,2851 ****
  465. --- 3105,3120 ----
  466.               (p1[Z] + p2[Z]) / 2.0,
  467.               p2[X] - p1[X], p2[Y] - p1[Y], p2[Z] - p1[Z]);
  468.           break;
  469. +         case OUTPUT_RAYCE:
  470. +         tab_indent();
  471. +         fprintf(outfile, "object { box { <%g, %g, %g>, <%g, %g, %g> }",
  472. +             p1[X], p1[Y], p1[Z], p2[X], p2[Y], p2[Z]);
  473. +         if (texture_name != NULL)
  474. +             fprintf(outfile, " texture { %s }", texture_name);
  475. +         fprintf(outfile, " }\n\n");
  476. +         break;
  477.           }
  478.       }
  479.   }
  480. ***************
  481. *** 3379,3384 ****
  482. --- 3648,3691 ----
  483.               fprintf(outfile, "\n");
  484.               break;
  485.   
  486. +         case OUTPUT_RAYCE:
  487. +             tab_indent();
  488. +             fprintf(outfile, "object {\n");
  489. +             tab_inc();
  490. +             tab_indent();
  491. +             if (norm == NULL)
  492. +             fprintf(outfile, "triangle {\n");
  493. +             else
  494. +             fprintf(outfile, "smooth_triangle {\n");
  495. +             tab_inc();
  496. +             for (i=0;i<3;++i) {
  497. +             tab_indent();
  498. +             fprintf(outfile, "<%g, %g, %g>",
  499. +                out_verts[t][i][X],
  500. +                out_verts[t][i][Y],
  501. +                out_verts[t][i][Z]);
  502. +             if (norm != NULL)
  503. +                fprintf(outfile, ", <%g, %g, %g>",
  504. +                   out_norms[t][i][X],
  505. +                   out_norms[t][i][Y],
  506. +                   out_norms[t][i][Z]);
  507. +             if (i < 2)
  508. +                fprintf(outfile, ",");
  509. +             fprintf(outfile, "\n");
  510. +             } /*for*/
  511. +             tab_dec();
  512. +             tab_indent();
  513. +             fprintf(outfile, "} /* smooth triangle */\n");
  514. +             if (texture_name != NULL) {
  515. +                tab_indent();
  516. +                fprintf(outfile, "texture { %s }\n", texture_name);
  517. +             }
  518. +             tab_dec();
  519. +             tab_indent();
  520. +             fprintf(outfile, "} /* object */\n\n");
  521. +             break;
  522.           case OUTPUT_RAWTRI:
  523.               for (i=0;i<3;++i) {
  524.               fprintf(outfile, "%-10.5g %-10.5g %-10.5g  ",
  525. ***************
  526. *** 3604,3609 ****
  527. --- 3911,3944 ----
  528.           fprintf(outfile, "\n");
  529.           break;
  530.   
  531. +         case OUTPUT_RAYCE:
  532. +         tab_indent();
  533. +         fprintf(outfile, "object {\n");
  534. +         tab_inc();
  535. +         tab_indent();
  536. +         fprintf(outfile, "polygon {\n");
  537. +         tab_inc();
  538. +         for (num_vert = 0; num_vert < tot_vert; num_vert++) {
  539. +             tab_indent();
  540. +             fprintf(outfile, " <%g, %g, %g>",
  541. +                  vert[num_vert][X],
  542. +                  vert[num_vert][Y],
  543. +                  vert[num_vert][Z]);
  544. +             if (num_vert < tot_vert-1)
  545. +                fprintf(outfile, ",");
  546. +             fprintf(outfile, "\n");
  547. +         }
  548. +         tab_dec();
  549. +         tab_indent();
  550. +         fprintf(outfile, "} /* polygon */\n");
  551. +         if (texture_name != NULL) {
  552. +             tab_indent();
  553. +             fprintf(outfile, "texture { %s }\n", texture_name);
  554. +         }
  555. +         tab_dec();
  556. +         tab_indent();
  557. +         fprintf(outfile, "}\n\n");
  558. +         break;
  559.        } /* switch */
  560.       } /* else !OUTPUT_DELAYED */
  561.   }
  562. ***************
  563. *** 3890,3895 ****
  564. --- 4225,4231 ----
  565.          case OUTPUT_POVRAY_20:
  566.          case OUTPUT_PLG:
  567.          case OUTPUT_RAWTRI:
  568. +        case OUTPUT_RAYCE:
  569.           lib_output_viewpoint(view.from, view.at, view.up, view.angle,
  570.               view.aspect, view.hither, view.resx, view.resy);
  571.   
  572.