NCBI C Toolkit Cross Reference

C/vibrant/prim3d1.c


  1 /*   prim3d1.c
  2 * ===========================================================================
  3 *
  4 *                            PUBLIC DOMAIN NOTICE
  5 *            National Center for Biotechnology Information (NCBI)
  6 *
  7 *  This software/database is a "United States Government Work" under the
  8 *  terms of the United States Copyright Act.  It was written as part of
  9 *  the author's official duties as a United States Government employee and
 10 *  thus cannot be copyrighted.  This software/database is freely available
 11 *  to the public for use. The National Library of Medicine and the U.S.
 12 *  Government do not place any restriction on its use or reproduction.
 13 *  We would, however, appreciate having the NCBI and the author cited in
 14 *  any work or product based on this material
 15 *
 16 *  Although all reasonable efforts have been taken to ensure the accuracy
 17 *  and reliability of the software and data, the NLM and the U.S.
 18 *  Government do not and cannot warrant the performance or results that
 19 *  may be obtained by using this software or data. The NLM and the U.S.
 20 *  Government disclaim all warranties, express or implied, including
 21 *  warranties of performance, merchantability or fitness for any particular
 22 *  purpose.
 23 *
 24 * ===========================================================================
 25 *
 26 * File Name:  prim3d1.c
 27 *
 28 * Author:  Alex Smirnov
 29 *
 30 * Version Creation Date:   04/03/95
 31 *
 32 * $Revision: 6.1 $
 33 *
 34 * File Description: 
 35 *
 36 * Modifications:  
 37 * --------------------------------------------------------------------------
 38 * Date     Name        Description of modification
 39 * -------  ----------  -----------------------------------------------------
 40 *
 41 *
 42 * ==========================================================================
 43 */
 44 
 45 #ifndef _VIBRANT_
 46 #include <vibrant.h>
 47 #endif
 48 
 49 #ifndef _PPICT3D_
 50 #include <ppict3d.h>
 51 #endif
 52 
 53 #ifndef _PDIAGNOS_
 54 #include <pdiagnos.h>
 55 #endif
 56 
 57 /*****************************************************************************
 58 *
 59 *   DEFINES
 60 *
 61 *****************************************************************************/
 62 #define SETPIXEL(zptr,imageptr,z,color,colorScale) \
 63 if((Uint2)z>=*((Uint2Ptr)zptr)) \
 64 {*((Uint2Ptr)zptr)=(Uint2)z;*((Uint1Ptr)imageptr)= \
 65 (Uint1)(color+(z<<8)/colorScale);}
 66 
 67 #define SETPIXELID(zptr,imageptr,z,curID) \
 68 if((Uint2)z>=*((Uint2Ptr)zptr)) \
 69 {*((Uint2Ptr)zptr)=(Uint2)z;*((VoidPtr*)imageptr)=(VoidPtr)curID;}
 70 
 71 /*****************************************************************************
 72 *
 73 *   TYPEDEFS
 74 *
 75 *****************************************************************************/
 76 
 77 /*****************************************************************************
 78 *
 79 *   GLOBAL VARIABLE
 80 *
 81 *****************************************************************************/
 82 extern Nlm_Context3D Nlm_stCon;
 83 
 84 /*****************************************************************************
 85 *
 86 *   STATIC VARIABLE
 87 *
 88 *****************************************************************************/
 89 
 90 /*****************************************************************************
 91 *
 92 *   FUNCTIONS
 93 *
 94 *****************************************************************************/
 95 static void Nlm_Empty3D ( Nlm_VoidPtr p )
 96 {
 97 }
 98 
 99 /*****************************************************************************
100 *
101 *   LINE
102 *
103 *****************************************************************************/
104 typedef struct Nlm_line3d {
105   Nlm_Base3D  base;
106   long        x1,y1,z1;
107   long        x2,y2,z2;
108 } Nlm_Line3D, PNTR Nlm_Line3DPtr;
109 
110 static void Nlm_Line3DDraw ( Nlm_Line3DPtr p )
111 {
112   register long reg1;
113   register long reg2;
114   register long reg3;
115   register long reg4;
116   long          x1,x2;
117   long          y1,y2;
118   long          z1,z2;
119   long          dx, dy, dz;
120   long          xx1,xx2;
121   long          yy1,yy2;
122   long          zz1,zz2;
123   long          status2;
124   long          orient;
125   long          endPtr;
126   long          colorScale;
127   long          color;
128   long          offset1;
129   long          offset2;
130   long          zrate;
131   long          ystep;
132   long          zystep;
133   long          curz;
134 
135   reg1 = (long)p;
136 
137   /* Rotate and check */
138   reg2 = Nlm_stCon.a[0][0];
139   reg3 = ((Nlm_Line3DPtr)reg1)->x1 / (long)reg2;
140   reg4 = ((Nlm_Line3DPtr)reg1)->x2 / (long)reg2;
141   reg2 = Nlm_stCon.a[0][1];
142   reg3 += ((Nlm_Line3DPtr)reg1)->y1 / (long)reg2;
143   reg4 += ((Nlm_Line3DPtr)reg1)->y2 / (long)reg2;
144   reg2 = Nlm_stCon.a[0][2];
145   reg3 += ((Nlm_Line3DPtr)reg1)->z1 / (long)reg2;
146   reg4 += ((Nlm_Line3DPtr)reg1)->z2 / (long)reg2;
147   reg2 = Nlm_stCon.c[0];
148   reg3 += reg2;
149   reg4 += reg2;
150   x1 = reg3; x2 = reg4;
151 
152   reg2 = Nlm_stCon.a[1][0];
153   reg3 = ((Nlm_Line3DPtr)reg1)->x1 / (long)reg2;
154   reg4 = ((Nlm_Line3DPtr)reg1)->x2 / (long)reg2;
155   reg2 = Nlm_stCon.a[1][1];
156   reg3 += ((Nlm_Line3DPtr)reg1)->y1 / (long)reg2;
157   reg4 += ((Nlm_Line3DPtr)reg1)->y2 / (long)reg2;
158   reg2 = Nlm_stCon.a[1][2];
159   reg3 += ((Nlm_Line3DPtr)reg1)->z1 / (long)reg2;
160   reg4 += ((Nlm_Line3DPtr)reg1)->z2 / (long)reg2;
161   reg2 = Nlm_stCon.c[1];
162   reg3 += reg2;
163   reg4 += reg2;
164   y1 = reg3; y2 = reg4;
165 
166   reg2 = Nlm_stCon.a[2][0];
167   reg3 = ((Nlm_Line3DPtr)reg1)->x1 / (long)reg2;
168   reg4 = ((Nlm_Line3DPtr)reg1)->x2 / (long)reg2;
169   reg2 = Nlm_stCon.a[2][1];
170   reg3 += ((Nlm_Line3DPtr)reg1)->y1 / (long)reg2;
171   reg4 += ((Nlm_Line3DPtr)reg1)->y2 / (long)reg2;
172   reg2 = Nlm_stCon.a[2][2];
173   reg3 += ((Nlm_Line3DPtr)reg1)->z1 / (long)reg2;
174   reg4 += ((Nlm_Line3DPtr)reg1)->z2 / (long)reg2;
175   reg2 = Nlm_stCon.c[2];
176   reg3 += reg2;
177   reg4 += reg2;
178   z1 = reg3; z2 = reg4;
179 
180   reg2 = Nlm_stCon.width>>1;
181   reg3 = x1-reg2;
182   x1 = reg2 + (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z1);
183   reg3 = x2-reg2;
184   reg4 = reg2 + (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z2);
185   x2 = reg4;
186   reg3 = x1;
187   if ( reg3 < reg4 ) {
188    if ( (reg4 < Nlm_stCon.xmin)||(reg3 > Nlm_stCon.xmax) ) return;
189   } else {
190    if ( (reg3 < Nlm_stCon.xmin)||(reg4 > Nlm_stCon.xmax) ) return;
191   }
192   dx = reg4-reg3;
193   reg2 = Nlm_stCon.height>>1;
194   reg3 = y1-reg2;
195   y1 = reg2 Y_PLUS (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z1);
196   reg3 = y2-reg2;
197   reg4 = reg2 Y_PLUS (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z2);
198   y2 = reg4;
199   reg3 = y1;
200   if ( reg3 < reg4 ) {
201    if ( (reg4 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) return;
202   } else {
203    if ( (reg3 < Nlm_stCon.ymin)||(reg4 > Nlm_stCon.ymax) ) return;
204   }
205   dy = reg4-reg3;
206   reg3 = z1;
207   reg3 = (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-reg3);
208   reg4 = z2;
209   reg4 = (reg4*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-reg4);
210   z1 = reg3; z2 = reg4; dz = reg4-reg3;
211 
212   /* x1,y1,z1 - first point    
213     x2,y2,z2 - second point
214     dx,dy,dz - vector */
215 
216   /* Set color and colorscale */
217   color = Nlm_stCon.colorOffset + 
218     ((Nlm_Line3DPtr)reg1)->base.color * Nlm_stCon.colorStep + 
219     (Nlm_stCon.colorStep >> 1);
220   colorScale = Nlm_stCon.colorScale << 1;
221   ystep = Nlm_stCon.width;
222   zystep = ystep<<1;
223 
224   /* Calculate status1(reg1) and status2(reg2) */
225   reg1 = 0;
226   reg2 = 0;
227   reg3 = x1;
228   reg4 = Nlm_stCon.xmin;
229   if ( reg3 < reg4 ) reg1 = 1;
230   else if ( reg3 > Nlm_stCon.xmax ) reg1 = 2;
231   reg3 = x2;
232   if ( reg3 < reg4 ) reg2 = 1;
233   else if ( reg3 > Nlm_stCon.xmax ) reg2 = 2;
234 
235   reg3 = y1;
236   reg4 = Nlm_stCon.ymin;
237   if ( reg3 < reg4 ) reg1 += 6;
238   else if ( reg3 > Nlm_stCon.ymax ) reg1 += 3;
239   reg3 = y2;
240   if ( reg3 < reg4 ) reg2 += 6;
241   else if ( reg3 > Nlm_stCon.ymax ) reg2 += 3;
242 
243   /* Save status2*/
244   status2 = reg2;
245 
246   /* Calculate the first point (xx1,yy1,zz1)*/
247   switch ( reg1 ) {
248     case 0: 
249       xx1 = x1; yy1=y1; zz1=z1;
250       break;
251     case 1:
252       reg1 = x1; reg2 = Nlm_stCon.xmin;
253       reg4 = x2-reg1;
254       reg3 = y1 + dy*(reg2-reg1)/reg4;
255       yy1 = reg3;
256       xx1 = reg2;
257       zz1 = z1 + dz*(reg2-reg1)/reg4;
258       break;
259     case 2:
260       reg1 = x1; reg2 = Nlm_stCon.xmax;
261       reg4 = x2-reg1;
262       reg3 = y1 + dy*(reg2-reg1)/reg4;
263       yy1 = reg3;
264       xx1 = reg2;
265       zz1 = z1 + dz*(reg2-reg1)/reg4;
266       break;
267     case 3:
268       reg1 = y1; reg2 = Nlm_stCon.ymax;
269       reg4 = y2-reg1;
270       reg3 = x1 + dx*(reg2-reg1)/reg4;
271       xx1 = reg3;
272       yy1 = reg2;
273       zz1 = z1 + dz*(reg2-reg1)/reg4;
274       break;
275     case 4:
276       reg1 = x1; reg2 = Nlm_stCon.xmin;
277       reg4 = x2-reg1;
278       reg3 = y1 + dy*(reg2-reg1)/reg4;
279       yy1 = reg3;
280       xx1 = reg2;
281       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
282         reg1 = y1; reg2 = Nlm_stCon.ymax;
283         reg4 = y2-reg1;
284         reg3 = x1 + dx*(reg2-reg1)/reg4;
285         xx1 = reg3;
286         yy1 = reg2;
287       }
288       zz1 = z1 + dz*(reg2-reg1)/reg4;
289       break;
290     case 5:
291       reg1 = x1; reg2 = Nlm_stCon.xmax;
292       reg4 = x2-reg1;
293       reg3 = y1 + dy*(reg2-reg1)/reg4;
294       yy1 = reg3;
295       xx1 = reg2;
296       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
297         reg1 = y1; reg2 = Nlm_stCon.ymax;
298         reg4 = y2-reg1;
299         reg3 = x1 + dx*(reg2-reg1)/reg4;
300         xx1 = reg3;
301         yy1 = reg2;
302       }
303       zz1 = z1 + dz*(reg2-reg1)/reg4;
304       break;
305     case 6:
306       reg1 = y1; reg2 = Nlm_stCon.ymin;
307       reg4 = y2-reg1;
308       reg3 = x1 + dx*(reg2-reg1)/reg4;
309       xx1 = reg3;
310       yy1 = reg2;
311       zz1 = z1 + dz*(reg2-reg1)/reg4;
312       break;
313     case 7:
314       reg1 = x1; reg2 = Nlm_stCon.xmin;
315       reg4 = x2-reg1;
316       reg3 = y1 + dy*(reg2-reg1)/reg4;
317       yy1 = reg3;
318       xx1 = reg2;
319       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
320         reg1 = y1; reg2 = Nlm_stCon.ymin;
321         reg4 = y2-reg1;
322         reg3 = x1 + dx*(reg2-reg1)/reg4;
323         xx1 = reg3;
324         yy1 = reg2;
325       }
326       zz1 = z1 + dz*(reg2-reg1)/reg4;
327       break;
328     default:
329       reg1 = x1; reg2 = Nlm_stCon.xmax;
330       reg4 = x2-reg1;
331       reg3 = y1 + dy*(reg2-reg1)/reg4;
332       yy1 = reg3;
333       xx1 = reg2;
334       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
335         reg1 = y1; reg2 = Nlm_stCon.ymin;
336         reg4 = y2-reg1;
337         reg3 = x1 + dx*(reg2-reg1)/reg4;
338         xx1 = reg3;
339         yy1 = reg2;
340       }
341       zz1 = z1 + dz*(reg2-reg1)/reg4;
342   }
343 
344   /* Calculate the second point (xx2,yy2,zz2)*/
345   switch ( status2 ) {
346     case 0: 
347       xx2 = x2; yy2=y2; zz2=z2;
348       break;
349     case 1:
350       reg1 = x1; reg2 = Nlm_stCon.xmin;
351       reg4 = x2-reg1;
352       yy2 = y1 + dy*(reg2-reg1)/reg4;
353       xx2 = reg2;
354       zz2 = z1 + dz*(reg2-reg1)/reg4;
355       break;
356     case 2:
357       reg1 = x1; reg2 = Nlm_stCon.xmax;
358       reg4 = x2-reg1;
359       yy2 = y1 + dy*(reg2-reg1)/reg4;
360       xx2 = reg2;
361       zz2 = z1 + dz*(reg2-reg1)/reg4;
362       break;
363     case 3:
364       reg1 = y1; reg2 = Nlm_stCon.ymax;
365       reg4 = y2-reg1;
366       xx2 = x1 + dx*(reg2-reg1)/reg4;
367       yy2 = reg2;
368       zz2 = z1 + dz*(reg2-reg1)/reg4;
369       break;
370     case 4:
371       reg1 = x1; reg2 = Nlm_stCon.xmin;
372       reg4 = x2-reg1;
373       reg3 = y1 + dy*(reg2-reg1)/reg4;
374       yy2 = reg3;
375       xx2 = reg2;
376       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
377         reg1 = y1; reg2 = Nlm_stCon.ymax;
378         reg4 = y2-reg1;
379         reg3 = x1 + dx*(reg2-reg1)/reg4;
380         xx2 = reg3;
381         yy2 = reg2;
382       }
383       zz2 = z1 + dz*(reg2-reg1)/reg4;
384       break;
385     case 5:
386       reg1 = x1; reg2 = Nlm_stCon.xmax;
387       reg4 = x2-reg1;
388       reg3 = y1 + dy*(reg2-reg1)/reg4;
389       yy2 = reg3;
390       xx2 = reg2;
391       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
392         reg1 = y1; reg2 = Nlm_stCon.ymax;
393         reg4 = y2-reg1;
394         reg3 = x1 + dx*(reg2-reg1)/reg4;
395         xx2 = reg3;
396         yy2 = reg2;
397       }
398       zz2 = z1 + dz*(reg2-reg1)/reg4;
399       break;
400     case 6:
401       reg1 = y1; reg2 = Nlm_stCon.ymin;
402       reg4 = y2-reg1;
403       xx2 = x1 + dx*(reg2-reg1)/reg4;
404       yy2 = reg2;
405       zz2 = z1 + dz*(reg2-reg1)/reg4;
406       break;
407     case 7:
408       reg1 = x1; reg2 = Nlm_stCon.xmin;
409       reg4 = x2-reg1;
410       reg3 = y1 + dy*(reg2-reg1)/reg4;
411       yy2 = reg3;
412       xx2 = reg2;
413       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
414         reg1 = y1; reg2 = Nlm_stCon.ymin;
415         reg4 = y2-reg1;
416         reg3 = x1 + dx*(reg2-reg1)/reg4;
417         xx2 = reg3;
418         yy2 = reg2;
419       }
420       zz2 = z1 + dz*(reg2-reg1)/reg4;
421       break;
422     default:
423       reg1 = x1; reg2 = Nlm_stCon.xmax;
424       reg4 = x2-reg1;
425       reg3 = y1 + dy*(reg2-reg1)/reg4;
426       yy2 = reg3;
427       xx2 = reg2;
428       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
429         reg1 = y1; reg2 = Nlm_stCon.ymin;
430         reg4 = y2-reg1;
431         reg3 = x1 + dx*(reg2-reg1)/reg4;
432         xx2 = reg3;
433         yy2 = reg2;
434       }
435       zz2 = z1 + dz*(reg2-reg1)/reg4;
436   }
437 
438   reg3 = xx1;
439   reg4 = xx2;
440   if ( reg3 < reg4 ) {
441     if ( (reg3 < Nlm_stCon.xmin)||(reg4 > Nlm_stCon.xmax) ) return;
442     reg1 = 0;
443   } else {
444     if ( (reg4 < Nlm_stCon.xmin)||(reg3 > Nlm_stCon.xmax) ) return;
445     reg1 = 1;
446   }
447   reg3 = yy1;
448   reg4 = yy2;
449   if ( reg3 < reg4 ) {
450     if ( (reg3 < Nlm_stCon.ymin)||(reg4 > Nlm_stCon.ymax) ) return;
451   } else {
452     if ( (reg4 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) return;
453     reg1 |= 0x2;
454   }
455   orient = reg1;
456 
457   /* Calculate offsets and pointers */
458   reg1 = yy1 * Nlm_stCon.width + xx1;
459   offset1 = reg1;
460   reg3 = (long)(Nlm_stCon.image + reg1);
461   reg2 = yy2 * Nlm_stCon.width + xx2;
462   offset2 = reg2;
463   reg4 = (long)(Nlm_stCon.image + reg2);
464   if ( reg3 == reg4 ){
465     reg2 = (long)(Nlm_stCon.zBuffer + reg1);
466     reg1 = zz1;
467     if ( reg1 < zz2 ) reg1 = zz2;
468     SETPIXEL ( reg2, reg3, reg1, color, colorScale );
469     return;
470   }
471   /* reg3 - statrt reg4 - end */
472 
473   /* Will be:
474      reg1 - last orientation
475      reg2 - zz1
476      reg3 - start
477      reg4 - zPtr
478      endPtr saved in endPtr */
479   reg1 = orient;
480   switch ( reg1 ){
481     case 0:
482       dy = yy2 - yy1;
483       reg2 = xx2 - xx1;
484       dx = reg2;
485       if ( reg2>dy ) {
486         zrate = ((zz2 - zz1)<<10)/reg2;
487       } else {
488         zrate = ((zz2 - zz1)<<10)/dy;
489         reg1 = 2;
490       }
491       reg2 = zz1;
492       endPtr = reg4;
493       reg4 = (long)(Nlm_stCon.zBuffer + offset1);
494       break;
495     case 1:
496       dy = yy2 - yy1;
497       reg2 = xx1 - xx2;
498       if ( reg2 > dy ) {
499         zrate = ((zz1 - zz2)<<10)/reg2;
500       } else {
501         zrate = ((zz1 - zz2)<<10)/dy;
502         reg1 = 3;
503       }
504       dx = reg2;
505       reg2 = reg3; reg3 = reg4; reg4 = reg2;
506       reg2 = zz2;
507       endPtr = reg4;
508       reg4 = (long)(Nlm_stCon.zBuffer + offset2);
509       break;
510     case 2:
511       dy = yy1 - yy2;
512       reg2 = xx2 - xx1;
513       if ( reg2 > dy ){
514         zrate = ((zz2 - zz1)<<10)/reg2;
515         reg1 = 1;
516       } else {
517         zrate = ((zz2 - zz1)<<10)/dy;
518         reg1 = 3;
519       }
520       dx = reg2;
521       reg2 = zz1;
522       endPtr = reg4;
523       reg4 = (long)(Nlm_stCon.zBuffer + offset1);
524       break;
525     default:
526       dy = yy1 - yy2;
527       reg2 = xx1 - xx2;
528       if ( reg2 > dy ){
529         zrate = ((zz1 - zz2)<<10)/reg2;
530         reg1 = 0;
531       } else {
532         zrate = ((zz1 - zz2)<<10)/dy;
533         reg1 = 2;
534       }
535       dx = reg2;
536       reg2 = reg3; reg3 = reg4; reg4 = reg2;
537       reg2 = zz2;
538       endPtr = reg4;
539       reg4 = (long)(Nlm_stCon.zBuffer + offset2);
540   }
541 
542   SETPIXEL(reg4,reg3,reg2,color,colorScale);
543   reg2 <<= 10;
544   /* Will be: reg1 - err */
545   switch ( reg1 ){
546     case 0:
547       reg1 = -(dx>>1);
548       do {
549         reg1 += dy;
550         if ( reg1 > 0 ){
551            reg3 += ystep; 
552            reg4 += zystep; 
553            reg1 -= dx; 
554         }
555         reg3++; reg4++; reg4++;
556         reg2 += zrate; 
557         curz = reg2;
558         reg2 >>= 10;
559         SETPIXEL(reg4,reg3,reg2,color,colorScale);
560         reg2 = curz;
561       } while ( reg3 != endPtr );
562       break;
563     case 1:
564       reg1 = -(dx>>1);
565       do {
566         reg1 += dy;
567         if ( reg1 > 0 ){
568            reg3 -= ystep; 
569            reg4 -= zystep; 
570            reg1 -= dx; 
571         }
572       reg3++; reg4++; reg4++;
573         reg2 += zrate; 
574         curz = reg2;
575         reg2 >>= 10;
576         SETPIXEL(reg4,reg3,reg2,color,colorScale);
577         reg2 = curz;
578       } while ( reg3 != endPtr );
579       break;
580     case 2:
581       reg1 = -(dy>>1);
582       do {
583         reg1 += dx;
584         if ( reg1 > 0 ) {
585            reg3 ++;
586            reg4 ++; reg4++;
587            reg1 -= dy; 
588         }
589         reg3 += ystep; 
590         reg4 += zystep; 
591         reg2 += zrate; 
592         curz = reg2;
593         reg2 >>= 10;
594         SETPIXEL(reg4,reg3,reg2,color,colorScale);
595         reg2 = curz;
596       } while ( reg3 != endPtr );
597       break;
598     default:
599       reg1 = -(dy>>1);
600       do {
601         reg1 += dx;
602         if ( reg1 > 0 ) {
603            reg3 ++;
604            reg4 ++; reg4++;
605            reg1 -= dy; 
606         }
607         reg3 -= ystep; 
608         reg4 -= zystep; 
609         reg2 += zrate; 
610         curz = reg2;
611         reg2 >>= 10;
612         SETPIXEL(reg4,reg3,reg2,color,colorScale);
613         reg2 = curz;
614       } while ( reg3 != endPtr );
615   }
616 }
617 
618 static void Nlm_Line3DHitT ( Nlm_Line3DPtr p )
619 {
620   register long reg1;
621   register long reg2;
622   register long reg3;
623   register long reg4;
624   long          x1,x2;
625   long          y1,y2;
626   long          z1,z2;
627   long          dx, dy, dz;
628   long          xx1,xx2;
629   long          yy1,yy2;
630   long          zz1,zz2;
631   long          status2;
632   long          orient;
633   long          endPtr;
634   long          offset1;
635   long          offset2;
636   long          zrate;
637   long          ystep;
638   long          zystep;
639   long          curz;
640 
641   reg1 = (long)p;
642 
643   /* Rotate and check */
644   reg2 = Nlm_stCon.a[0][0];
645   reg3 = ((Nlm_Line3DPtr)reg1)->x1 / (long)reg2;
646   reg4 = ((Nlm_Line3DPtr)reg1)->x2 / (long)reg2;
647   reg2 = Nlm_stCon.a[0][1];
648   reg3 += ((Nlm_Line3DPtr)reg1)->y1 / (long)reg2;
649   reg4 += ((Nlm_Line3DPtr)reg1)->y2 / (long)reg2;
650   reg2 = Nlm_stCon.a[0][2];
651   reg3 += ((Nlm_Line3DPtr)reg1)->z1 / (long)reg2;
652   reg4 += ((Nlm_Line3DPtr)reg1)->z2 / (long)reg2;
653   reg2 = Nlm_stCon.c[0];
654   reg3 += reg2;
655   reg4 += reg2;
656   x1 = reg3; x2 = reg4;
657 
658   reg2 = Nlm_stCon.a[1][0];
659   reg3 = ((Nlm_Line3DPtr)reg1)->x1 / (long)reg2;
660   reg4 = ((Nlm_Line3DPtr)reg1)->x2 / (long)reg2;
661   reg2 = Nlm_stCon.a[1][1];
662   reg3 += ((Nlm_Line3DPtr)reg1)->y1 / (long)reg2;
663   reg4 += ((Nlm_Line3DPtr)reg1)->y2 / (long)reg2;
664   reg2 = Nlm_stCon.a[1][2];
665   reg3 += ((Nlm_Line3DPtr)reg1)->z1 / (long)reg2;
666   reg4 += ((Nlm_Line3DPtr)reg1)->z2 / (long)reg2;
667   reg2 = Nlm_stCon.c[1];
668   reg3 += reg2;
669   reg4 += reg2;
670   y1 = reg3; y2 = reg4;
671 
672   reg2 = Nlm_stCon.a[2][0];
673   reg3 = ((Nlm_Line3DPtr)reg1)->x1 / (long)reg2;
674   reg4 = ((Nlm_Line3DPtr)reg1)->x2 / (long)reg2;
675   reg2 = Nlm_stCon.a[2][1];
676   reg3 += ((Nlm_Line3DPtr)reg1)->y1 / (long)reg2;
677   reg4 += ((Nlm_Line3DPtr)reg1)->y2 / (long)reg2;
678   reg2 = Nlm_stCon.a[2][2];
679   reg3 += ((Nlm_Line3DPtr)reg1)->z1 / (long)reg2;
680   reg4 += ((Nlm_Line3DPtr)reg1)->z2 / (long)reg2;
681   reg2 = Nlm_stCon.c[2];
682   reg3 += reg2;
683   reg4 += reg2;
684   z1 = reg3; z2 = reg4;
685 
686   reg2 = Nlm_stCon.width>>1;
687   reg3 = x1-reg2;
688   x1 = reg2 + (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z1);
689   reg3 = x2-reg2;
690   reg4 = reg2 + (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z2);
691   x2 = reg4;
692   reg3 = x1;
693   if ( reg3 < reg4 ) {
694    if ( (reg4 < Nlm_stCon.xmin)||(reg3 > Nlm_stCon.xmax) ) return;
695   } else {
696    if ( (reg3 < Nlm_stCon.xmin)||(reg4 > Nlm_stCon.xmax) ) return;
697   }
698   dx = reg4-reg3;
699   reg2 = Nlm_stCon.height>>1;
700   reg3 = y1-reg2;
701   y1 = reg2 Y_PLUS (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z1);
702   reg3 = y2-reg2;
703   reg4 = reg2 Y_PLUS (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-z2);
704   y2 = reg4;
705   reg3 = y1;
706   if ( reg3 < reg4 ) {
707    if ( (reg4 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) return;
708   } else {
709    if ( (reg3 < Nlm_stCon.ymin)||(reg4 > Nlm_stCon.ymax) ) return;
710   }
711   dy = reg4-reg3;
712   reg3 = z1;
713   reg3 = (reg3*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-reg3);
714   reg4 = z2;
715   reg4 = (reg4*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-reg4);
716   z1 = reg3; z2 = reg4; dz = reg4-reg3;
717 
718   /* x1,y1,z1 - first point    
719     x2,y2,z2 - second point
720     dx,dy,dz - vector */
721 
722   ystep  = Nlm_stCon.widthCur * sizeof(Nlm_stCon.idBuffer[0]);
723   zystep = Nlm_stCon.widthCur * sizeof(Nlm_stCon.zBuffer[0]);
724 
725   /* Calculate status1(reg1) and status2(reg2) */
726   reg1 = 0;
727   reg2 = 0;
728   reg3 = x1;
729   reg4 = Nlm_stCon.xmin;
730   if ( reg3 < reg4 ) reg1 = 1;
731   else if ( reg3 > Nlm_stCon.xmax ) reg1 = 2;
732   reg3 = x2;
733   if ( reg3 < reg4 ) reg2 = 1;
734   else if ( reg3 > Nlm_stCon.xmax ) reg2 = 2;
735 
736   reg3 = y1;
737   reg4 = Nlm_stCon.ymin;
738   if ( reg3 < reg4 ) reg1 += 6;
739   else if ( reg3 > Nlm_stCon.ymax ) reg1 += 3;
740   reg3 = y2;
741   if ( reg3 < reg4 ) reg2 += 6;
742   else if ( reg3 > Nlm_stCon.ymax ) reg2 += 3;
743 
744   /* Save status2*/
745   status2 = reg2;
746 
747   /* Calculate the first point (xx1,yy1,zz1)*/
748   switch ( reg1 ) {
749     case 0: 
750       xx1 = x1; yy1=y1; zz1=z1;
751       break;
752     case 1:
753       reg1 = x1; reg2 = Nlm_stCon.xmin;
754       reg4 = x2-reg1;
755       reg3 = y1 + dy*(reg2-reg1)/reg4;
756       yy1 = reg3;
757       xx1 = reg2;
758       zz1 = z1 + dz*(reg2-reg1)/reg4;
759       break;
760     case 2:
761       reg1 = x1; reg2 = Nlm_stCon.xmax;
762       reg4 = x2-reg1;
763       reg3 = y1 + dy*(reg2-reg1)/reg4;
764       yy1 = reg3;
765       xx1 = reg2;
766       zz1 = z1 + dz*(reg2-reg1)/reg4;
767       break;
768     case 3:
769       reg1 = y1; reg2 = Nlm_stCon.ymax;
770       reg4 = y2-reg1;
771       reg3 = x1 + dx*(reg2-reg1)/reg4;
772       xx1 = reg3;
773       yy1 = reg2;
774       zz1 = z1 + dz*(reg2-reg1)/reg4;
775       break;
776     case 4:
777       reg1 = x1; reg2 = Nlm_stCon.xmin;
778       reg4 = x2-reg1;
779       reg3 = y1 + dy*(reg2-reg1)/reg4;
780       yy1 = reg3;
781       xx1 = reg2;
782       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
783         reg1 = y1; reg2 = Nlm_stCon.ymax;
784         reg4 = y2-reg1;
785         reg3 = x1 + dx*(reg2-reg1)/reg4;
786         xx1 = reg3;
787         yy1 = reg2;
788       }
789       zz1 = z1 + dz*(reg2-reg1)/reg4;
790       break;
791     case 5:
792       reg1 = x1; reg2 = Nlm_stCon.xmax;
793       reg4 = x2-reg1;
794       reg3 = y1 + dy*(reg2-reg1)/reg4;
795       yy1 = reg3;
796       xx1 = reg2;
797       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
798         reg1 = y1; reg2 = Nlm_stCon.ymax;
799         reg4 = y2-reg1;
800         reg3 = x1 + dx*(reg2-reg1)/reg4;
801         xx1 = reg3;
802         yy1 = reg2;
803       }
804       zz1 = z1 + dz*(reg2-reg1)/reg4;
805       break;
806     case 6:
807       reg1 = y1; reg2 = Nlm_stCon.ymin;
808       reg4 = y2-reg1;
809       reg3 = x1 + dx*(reg2-reg1)/reg4;
810       xx1 = reg3;
811       yy1 = reg2;
812       zz1 = z1 + dz*(reg2-reg1)/reg4;
813       break;
814     case 7:
815       reg1 = x1; reg2 = Nlm_stCon.xmin;
816       reg4 = x2-reg1;
817       reg3 = y1 + dy*(reg2-reg1)/reg4;
818       yy1 = reg3;
819       xx1 = reg2;
820       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
821         reg1 = y1; reg2 = Nlm_stCon.ymin;
822         reg4 = y2-reg1;
823         reg3 = x1 + dx*(reg2-reg1)/reg4;
824         xx1 = reg3;
825         yy1 = reg2;
826       }
827       zz1 = z1 + dz*(reg2-reg1)/reg4;
828       break;
829     default:
830       reg1 = x1; reg2 = Nlm_stCon.xmax;
831       reg4 = x2-reg1;
832       reg3 = y1 + dy*(reg2-reg1)/reg4;
833       yy1 = reg3;
834       xx1 = reg2;
835       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
836         reg1 = y1; reg2 = Nlm_stCon.ymin;
837         reg4 = y2-reg1;
838         reg3 = x1 + dx*(reg2-reg1)/reg4;
839         xx1 = reg3;
840         yy1 = reg2;
841       }
842       zz1 = z1 + dz*(reg2-reg1)/reg4;
843   }
844 
845   /* Calculate the second point (xx2,yy2,zz2)*/
846   switch ( status2 ) {
847     case 0: 
848       xx2 = x2; yy2=y2; zz2=z2;
849       break;
850     case 1:
851       reg1 = x1; reg2 = Nlm_stCon.xmin;
852       reg4 = x2-reg1;
853       yy2 = y1 + dy*(reg2-reg1)/reg4;
854       xx2 = reg2;
855       zz2 = z1 + dz*(reg2-reg1)/reg4;
856       break;
857     case 2:
858       reg1 = x1; reg2 = Nlm_stCon.xmax;
859       reg4 = x2-reg1;
860       yy2 = y1 + dy*(reg2-reg1)/reg4;
861       xx2 = reg2;
862       zz2 = z1 + dz*(reg2-reg1)/reg4;
863       break;
864     case 3:
865       reg1 = y1; reg2 = Nlm_stCon.ymax;
866       reg4 = y2-reg1;
867       xx2 = x1 + dx*(reg2-reg1)/reg4;
868       yy2 = reg2;
869       zz2 = z1 + dz*(reg2-reg1)/reg4;
870       break;
871     case 4:
872       reg1 = x1; reg2 = Nlm_stCon.xmin;
873       reg4 = x2-reg1;
874       reg3 = y1 + dy*(reg2-reg1)/reg4;
875       yy2 = reg3;
876       xx2 = reg2;
877       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
878         reg1 = y1; reg2 = Nlm_stCon.ymax;
879         reg4 = y2-reg1;
880         reg3 = x1 + dx*(reg2-reg1)/reg4;
881         xx2 = reg3;
882         yy2 = reg2;
883       }
884       zz2 = z1 + dz*(reg2-reg1)/reg4;
885       break;
886     case 5:
887       reg1 = x1; reg2 = Nlm_stCon.xmax;
888       reg4 = x2-reg1;
889       reg3 = y1 + dy*(reg2-reg1)/reg4;
890       yy2 = reg3;
891       xx2 = reg2;
892       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
893         reg1 = y1; reg2 = Nlm_stCon.ymax;
894         reg4 = y2-reg1;
895         reg3 = x1 + dx*(reg2-reg1)/reg4;
896         xx2 = reg3;
897         yy2 = reg2;
898       }
899       zz2 = z1 + dz*(reg2-reg1)/reg4;
900       break;
901     case 6:
902       reg1 = y1; reg2 = Nlm_stCon.ymin;
903       reg4 = y2-reg1;
904       xx2 = x1 + dx*(reg2-reg1)/reg4;
905       yy2 = reg2;
906       zz2 = z1 + dz*(reg2-reg1)/reg4;
907       break;
908     case 7:
909       reg1 = x1; reg2 = Nlm_stCon.xmin;
910       reg4 = x2-reg1;
911       reg3 = y1 + dy*(reg2-reg1)/reg4;
912       yy2 = reg3;
913       xx2 = reg2;
914       if ( (reg3 < Nlm_stCon.ymin) || (reg3 > Nlm_stCon.ymax) ) {
915         reg1 = y1; reg2 = Nlm_stCon.ymin;
916         reg4 = y2-reg1;
917         reg3 = x1 + dx*(reg2-reg1)/reg4;
918         xx2 = reg3;
919         yy2 = reg2;
920       }
921       zz2 = z1 + dz*(reg2-reg1)/reg4;
922       break;
923     default:
924       reg1 = x1; reg2 = Nlm_stCon.xmax;
925       reg4 = x2-reg1;
926       reg3 = y1 + dy*(reg2-reg1)/reg4;
927       yy2 = reg3;
928       xx2 = reg2;
929       if ( (reg3 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) {
930         reg1 = y1; reg2 = Nlm_stCon.ymin;
931         reg4 = y2-reg1;
932         reg3 = x1 + dx*(reg2-reg1)/reg4;
933         xx2 = reg3;
934         yy2 = reg2;
935       }
936       zz2 = z1 + dz*(reg2-reg1)/reg4;
937   }
938 
939   reg3 = xx1;
940   reg4 = xx2;
941   if ( reg3 < reg4 ) {
942     if ( (reg3 < Nlm_stCon.xmin)||(reg4 > Nlm_stCon.xmax) ) return;
943     reg1 = 0;
944   } else {
945     if ( (reg4 < Nlm_stCon.xmin)||(reg3 > Nlm_stCon.xmax) ) return;
946     reg1 = 1;
947   }
948   reg3 = yy1;
949   reg4 = yy2;
950   if ( reg3 < reg4 ) {
951     if ( (reg3 < Nlm_stCon.ymin)||(reg4 > Nlm_stCon.ymax) ) return;
952   } else {
953     if ( (reg4 < Nlm_stCon.ymin)||(reg3 > Nlm_stCon.ymax) ) return;
954     reg1 |= 0x2;
955   }
956   orient = reg1;
957 
958   /* Calculate offsets */
959   reg3 = Nlm_stCon.xmin;
960   xx1 -= reg3;  xx2 -= reg3;
961   reg3 = Nlm_stCon.ymin;
962   yy1 -= reg3; yy2 -=reg3;
963   /* Calculate offsets and pointers */
964   reg1 = yy1 * Nlm_stCon.widthCur + xx1;
965   offset1 = reg1;
966   reg3 = (long)(Nlm_stCon.idBuffer + reg1);
967   reg2 = yy2 * Nlm_stCon.widthCur + xx2;
968   offset2 = reg2;
969   reg4 = (long)(Nlm_stCon.idBuffer + reg2);
970   if ( reg3 == reg4 ){
971     reg2 = (long)(Nlm_stCon.zBuffer + reg1);
972     reg1 = zz1;
973     if ( reg1 < zz2 ) reg1 = zz2;
974     SETPIXELID ( reg2, reg3, reg1, p );
975     return;
976   }
977   /* reg3 - statrt reg4 - end */
978 
979   /* Will be:
980      reg1 - last orientation
981      reg2 - zz1
982      reg3 - start
983      reg4 - zPtr
984      endPtr saved in endPtr */
985   reg1 = orient;
986   switch ( reg1 ){
987     case 0:
988       dy = yy2 - yy1;
989       reg2 = xx2 - xx1;
990       dx = reg2;
991       if ( reg2>dy ) {
992         zrate = ((zz2 - zz1)<<10)/reg2;
993       } else {
994         zrate = ((zz2 - zz1)<<10)/dy;
995         reg1 = 2;
996       }
997       reg2 = zz1;
998       endPtr = reg4;
999       reg4 = (long)(Nlm_stCon.zBuffer + offset1);
1000       break;
1001     case 1:
1002       dy = yy2 - yy1;
1003       reg2 = xx1 - xx2;
1004       if ( reg2 > dy ) {
1005         zrate = ((zz1 - zz2)<<10)/reg2;
1006       } else {
1007         zrate = ((zz1 - zz2)<<10)/dy;
1008         reg1 = 3;
1009       }
1010       dx = reg2;
1011       reg2 = reg3; reg3 = reg4; reg4 = reg2;
1012       reg2 = zz2;
1013       endPtr = reg4;
1014       reg4 = (long)(Nlm_stCon.zBuffer + offset2);
1015       break;
1016     case 2:
1017       dy = yy1 - yy2;
1018       reg2 = xx2 - xx1;
1019       if ( reg2 > dy ){
1020         zrate = ((zz2 - zz1)<<10)/reg2;
1021         reg1 = 1;
1022       } else {
1023         zrate = ((zz2 - zz1)<<10)/dy;
1024         reg1 = 3;
1025       }
1026       dx = reg2;
1027       reg2 = zz1;
1028       endPtr = reg4;
1029       reg4 = (long)(Nlm_stCon.zBuffer + offset1);
1030       break;
1031     default:
1032       dy = yy1 - yy2;
1033       reg2 = xx1 - xx2;
1034       if ( reg2 > dy ){
1035         zrate = ((zz1 - zz2)<<10)/reg2;
1036         reg1 = 0;
1037       } else {
1038         zrate = ((zz1 - zz2)<<10)/dy;
1039         reg1 = 2;
1040       }
1041       dx = reg2;
1042       reg2 = reg3; reg3 = reg4; reg4 = reg2;
1043       reg2 = zz2;
1044       endPtr = reg4;
1045       reg4 = (long)(Nlm_stCon.zBuffer + offset2);
1046   }
1047 
1048   SETPIXELID(reg4,reg3,reg2,p);
1049   reg2 <<= 10;
1050   /* Will be: reg1 - err */
1051   switch ( reg1 ){
1052     case 0:
1053       reg1 = -(dx>>1);
1054       do {
1055         reg1 += dy;
1056         if ( reg1 > 0 ){
1057            reg3 += ystep; 
1058            reg4 += zystep; 
1059            reg1 -= dx; 
1060         }
1061         reg3 += sizeof(Nlm_stCon.idBuffer[0]); reg4++; reg4++;
1062         reg2 += zrate; 
1063         curz = reg2;
1064         reg2 >>= 10;
1065         SETPIXELID(reg4,reg3,reg2,p);
1066         reg2 = curz;
1067       } while ( reg3 != endPtr );
1068       break;
1069     case 1:
1070       reg1 = -(dx>>1);
1071       do {
1072         reg1 += dy;
1073         if ( reg1 > 0 ){
1074            reg3 -= ystep; 
1075            reg4 -= zystep; 
1076            reg1 -= dx; 
1077         }
1078         reg3 += sizeof(Nlm_stCon.idBuffer[0]); reg4++; reg4++;
1079         reg2 += zrate; 
1080         curz = reg2;
1081         reg2 >>= 10;
1082         SETPIXELID(reg4,reg3,reg2,p);
1083         reg2 = curz;
1084       } while ( reg3 != endPtr );
1085       break;
1086     case 2:
1087       reg1 = -(dy>>1);
1088       do {
1089         reg1 += dx;
1090         if ( reg1 > 0 ) {
1091            reg3 += sizeof(Nlm_stCon.idBuffer[0]);
1092            reg4 ++; reg4++;
1093            reg1 -= dy; 
1094         }
1095         reg3 += ystep; 
1096         reg4 += zystep; 
1097         reg2 += zrate; 
1098         curz = reg2;
1099         reg2 >>= 10;
1100         SETPIXELID(reg4,reg3,reg2,p);
1101         reg2 = curz;
1102       } while ( reg3 != endPtr );
1103       break;
1104     default:
1105       reg1 = -(dy>>1);
1106       do {
1107         reg1 += dx;
1108         if ( reg1 > 0 ) {
1109            reg3 += sizeof(Nlm_stCon.idBuffer[0]);
1110            reg4 ++; reg4++;
1111            reg1 -= dy; 
1112         }
1113         reg3 -= ystep; 
1114         reg4 -= zystep; 
1115         reg2 += zrate; 
1116         curz = reg2;
1117         reg2 >>= 10;
1118         SETPIXELID(reg4,reg3,reg2,p);
1119         reg2 = curz;
1120       } while ( reg3 != endPtr );
1121   }
1122 }
1123 
1124 static void Nlm_Line3DGetL ( Nlm_Line3DPtr p )
1125 {
1126   register BigScalar ax;
1127   register BigScalar bx;
1128   long minXY, maxXY;
1129 
1130   ax = (BigScalar)p;
1131   bx = (BigScalar)(((Nlm_PSeg3DPtr)ax)->base.parent);
1132   if ( ((Nlm_Line3DPtr)ax)->x1 > ((Nlm_Line3DPtr)ax)->x2 ){
1133     maxXY = ((Nlm_Line3DPtr)ax)->x1; minXY = ((Nlm_Line3DPtr)ax)->x2;
1134   } else {
1135     maxXY = ((Nlm_Line3DPtr)ax)->x2; minXY = ((Nlm_Line3DPtr)ax)->x1;
1136   }
1137   if ( ((Nlm_PSeg3DPtr)bx)->segBox.minX > minXY )
1138        ((Nlm_PSeg3DPtr)bx)->segBox.minX = minXY;
1139   if ( ((Nlm_PSeg3DPtr)bx)->segBox.maxX < maxXY )
1140        ((Nlm_PSeg3DPtr)bx)->segBox.maxX = maxXY;
1141   if ( ((Nlm_Line3DPtr)ax)->y1 > ((Nlm_Line3DPtr)ax)->y2 ){
1142     maxXY = ((Nlm_Line3DPtr)ax)->y1; minXY = ((Nlm_Line3DPtr)ax)->y2;
1143   } else {
1144     maxXY = ((Nlm_Line3DPtr)ax)->y2; minXY = ((Nlm_Line3DPtr)ax)->y1;
1145   }
1146   if ( ((Nlm_PSeg3DPtr)bx)->segBox.minY > minXY )
1147        ((Nlm_PSeg3DPtr)bx)->segBox.minY = minXY;
1148   if ( ((Nlm_PSeg3DPtr)bx)->segBox.maxY < maxXY )
1149        ((Nlm_PSeg3DPtr)bx)->segBox.maxY = maxXY;
1150   if ( ((Nlm_Line3DPtr)ax)->z1 > ((Nlm_Line3DPtr)ax)->z2 ){
1151     maxXY = ((Nlm_Line3DPtr)ax)->z1; minXY = ((Nlm_Line3DPtr)ax)->z2;
1152   } else {
1153     maxXY = ((Nlm_Line3DPtr)ax)->z2; minXY = ((Nlm_Line3DPtr)ax)->z1;
1154   }
1155   if ( ((Nlm_PSeg3DPtr)bx)->segBox.minZ > minXY )
1156        ((Nlm_PSeg3DPtr)bx)->segBox.minZ = minXY;
1157   if ( ((Nlm_PSeg3DPtr)bx)->segBox.maxZ < maxXY )
1158        ((Nlm_PSeg3DPtr)bx)->segBox.maxZ = maxXY;
1159 }
1160 
1161 static Nlm_PrimDef3D lineDef = {
1162   (Nlm_PrimDraw3D)Nlm_Line3DDraw,
1163   (Nlm_PrimHitTest3D)Nlm_Line3DHitT,
1164   (Nlm_PrimGetLimits3D)Nlm_Line3DGetL,
1165   (Nlm_PrimCleanup3D)Nlm_Empty3D,
1166   (Nlm_Int2)LINE3D
1167 };
1168 
1169 Nlm_Prim3D Nlm_AddLine3D ( Nlm_Picture3D pic, Nlm_Segment3D segment, 
1170                            BigScalar userData, Uint1 layer, Uint1 color,
1171                            Int4 x1, Int4 y1, Int4 z1,
1172                            Int4 x2, Int4 y2, Int4 z2 )
1173 {
1174   Nlm_Line3D l;
1175 
1176   Nlm_stCon.pic = pic;
1177   Nlm_DiagReset ();
1178   l.base.userData = userData;
1179   l.base.layer = layer;
1180   l.base.color = color;
1181   l.base.fTable = &lineDef;
1182   l.base.status = 0;
1183   l.x1 = (long)x1; l.x2 = (long)x2;
1184   l.y1 = (long)y1; l.y2 = (long)y2;
1185   l.z1 = (long)z1; l.z2 = (long)z2;
1186   return (Nlm_Prim3D) Nlm_AddPrim3D ( (Nlm_PSeg3DPtr)segment, 
1187                                       (Nlm_Base3DPtr)&l,
1188                                       sizeof(Nlm_Line3D), 
1189                                       "AddLine3D" );
1190 }
1191 
1192 
1193 

source navigation ]   [ diff markup ]   [ identifier search ]   [ freetext search ]   [ file search ]  

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.