|
NCBI Home IEB Home C Toolkit docs C++ Toolkit source browser C Toolkit source browser (2) |
NCBI C Toolkit Cross ReferenceC/vibrant/prim3d1.c |
source navigation diff markup identifier search freetext search file search |
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 |
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more information. |