1 /*   pictur3d.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:  pictur3d.c
27 *
28 * Author:  Alex Smirnov
29 *
30 * Version Creation Date:   04/03/95
31 *
32 * $Revision: 6.0 $
33 *
34 * File Description:
35 *  3D picture file.
36 *
37 * Modifications:
38 * --------------------------------------------------------------------------
39 * Date     Name        Description of modification
40 * -------  ----------  -----------------------------------------------------
41 *
42 *
43 * ==========================================================================
44 */
45 
46 #ifndef _PPICT3D_
47 #include <ppict3d.h>
48 #endif
49 
50 /*****************************************************************************
51 *
52 *   DEFINES
53 *
54 *****************************************************************************/
55 
56 /*****************************************************************************
57 *
58 *   TYPEDEFS
59 *
60 *****************************************************************************/
61 
62 /*****************************************************************************
63 *
64 *   GLOBAL VARIABLE
65 *
66 *****************************************************************************/
67 Nlm_Context3D Nlm_stCon;
68 
69 /*****************************************************************************
70 *
71 *   STATIC VARIABLE
72 *
73 *****************************************************************************/
74 static CharPtr Pict3Dclass = "Picture3D";
75 
76 /*****************************************************************************
77 *
78 *   FUNCTIONS
79 *
80 *****************************************************************************/
Nlm_AddToSeg(Nlm_PSeg3DPtr s,Nlm_Base3DPtr p)81 static void Nlm_AddToSeg ( Nlm_PSeg3DPtr s, Nlm_Base3DPtr p )
82 {
83   register long ax;
84   register long bx;
85 
86   ax = (long)s;
87   bx = (long)(((Nlm_PSeg3DPtr)ax)->last);
88   if ( bx ) {
89     ((Nlm_PSeg3DPtr)ax)->last = p;
90     ax = (long)p;
91     ((Nlm_Base3DPtr)bx)->next = (Nlm_Base3DPtr)ax;
92 	 ((Nlm_Base3DPtr)ax)->next = NULL;
93     ((Nlm_Base3DPtr)ax)->parent = (Nlm_Base3DPtr)s;
94   } else {
95     bx = (long)p;
96 	 ((Nlm_PSeg3DPtr)ax)->last = ((Nlm_PSeg3DPtr)ax)->first =
97       (Nlm_Base3DPtr)bx;
98 	 ((Nlm_Base3DPtr)bx)->next = NULL;
99 	 ((Nlm_Base3DPtr)bx)->parent = (Nlm_Base3DPtr)ax;
100   }
101 }
102 
Nlm_DeleteFromSeg(Nlm_PSeg3DPtr seg,Nlm_Base3DPtr base)103 static void Nlm_DeleteFromSeg ( Nlm_PSeg3DPtr seg, Nlm_Base3DPtr base )
104 {
105   register Nlm_Base3DPtr b;
106   register Nlm_Base3DPtr bprev;
107 
108   bprev = NULL;
109   for ( b = seg->first; (b != base) && (b != NULL); b = b->next ){
110     bprev = b;
111   }
112   if ( b != NULL ) {
113     if ( bprev != NULL ) bprev->next = b->next;
114     else seg->first = b->next;
115 	 if ( seg->last == b ) seg->last = bprev;
116   }
117 }
118 
Nlm_Seg3DDraw(Nlm_PSeg3DPtr s)119 static void Nlm_Seg3DDraw ( Nlm_PSeg3DPtr s )
120 {
121   register long ax;
122   register long  bx;
123   long           spx, spy, spz, rad;
124   Uint1          color;
125 
126   ax = (long)s;
127   rad = ((Nlm_PSeg3DPtr)ax)->segSph.radius / Nlm_stCon.scale;
128   spz = ((Nlm_PSeg3DPtr)ax)->segSph.x / Nlm_stCon.a[2][0] +
129 			((Nlm_PSeg3DPtr)ax)->segSph.y / Nlm_stCon.a[2][1] +
130 			((Nlm_PSeg3DPtr)ax)->segSph.z / Nlm_stCon.a[2][2] +
131 			Nlm_stCon.c[2];
132   spx = ((Nlm_PSeg3DPtr)ax)->segSph.x / Nlm_stCon.a[0][0] +
133 			((Nlm_PSeg3DPtr)ax)->segSph.y / Nlm_stCon.a[0][1] +
134 			((Nlm_PSeg3DPtr)ax)->segSph.z / Nlm_stCon.a[0][2] +
135 			Nlm_stCon.c[0];
136   bx = Nlm_stCon.width>>1;
137   spx -= bx;
138   bx = bx + (spx*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-spz);
139   if ( (Nlm_stCon.xmin > (bx + rad)) || (Nlm_stCon.xmax < (bx - rad)) )
140 	 return;
141   spy = ((Nlm_PSeg3DPtr)ax)->segSph.x / Nlm_stCon.a[1][0] +
142 			((Nlm_PSeg3DPtr)ax)->segSph.y / Nlm_stCon.a[1][1] +
143 			((Nlm_PSeg3DPtr)ax)->segSph.z / Nlm_stCon.a[1][2] +
144 			Nlm_stCon.c[1];
145   bx = Nlm_stCon.height>>1;
146   spy -= bx;
147   bx = bx Y_PLUS (spy*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-spz);
148   if ( (Nlm_stCon.ymin > (bx + rad)) || (Nlm_stCon.ymax < (bx - rad)) )
149 	 return;
150   ax = (long)(((Nlm_PSeg3DPtr)ax)->first);
151   while ( ax ){
152 	 if ( Nlm_stCon.layerTable[((Nlm_Base3DPtr)ax)->layer] ){
153       if ( ((Nlm_Base3DPtr)ax)->status & HL_MASK ){
154         color = ((Nlm_Base3DPtr)ax)->color;
155         ((Nlm_Base3DPtr)ax)->color = Nlm_stCon.colorHL;
156 		  ((Nlm_Base3DPtr)ax)->fTable->draw ( (Nlm_VoidPtr)ax );
157         ((Nlm_Base3DPtr)ax)->color = color;
158       } else {
159 		  ((Nlm_Base3DPtr)ax)->fTable->draw ( (Nlm_VoidPtr)ax );
160       }
161 	 }
162 	 ax = (long)(((Nlm_Base3DPtr)ax)->next);
163   }
164 }
165 
Nlm_Seg3DHitT(Nlm_PSeg3DPtr s)166 static void Nlm_Seg3DHitT ( Nlm_PSeg3DPtr s )
167 {
168   register long ax;
169   register long  bx;
170   long           spx, spy, spz, rad;
171 
172   ax = (long)s;
173   rad = ((Nlm_PSeg3DPtr)ax)->segSph.radius / Nlm_stCon.scale;
174   spz = ((Nlm_PSeg3DPtr)ax)->segSph.x / Nlm_stCon.a[2][0] +
175 			((Nlm_PSeg3DPtr)ax)->segSph.y / Nlm_stCon.a[2][1] +
176 			((Nlm_PSeg3DPtr)ax)->segSph.z / Nlm_stCon.a[2][2] +
177 			Nlm_stCon.c[2];
178   spx = ((Nlm_PSeg3DPtr)ax)->segSph.x / Nlm_stCon.a[0][0] +
179 			((Nlm_PSeg3DPtr)ax)->segSph.y / Nlm_stCon.a[0][1] +
180 			((Nlm_PSeg3DPtr)ax)->segSph.z / Nlm_stCon.a[0][2] +
181 			Nlm_stCon.c[0];
182   bx = Nlm_stCon.width>>1;
183   spx -= bx;
184   bx = bx + (spx*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-spz);
185   if ( (Nlm_stCon.xmin > (bx + rad)) || (Nlm_stCon.xmax < (bx - rad)) )
186 	 return;
187   spy = ((Nlm_PSeg3DPtr)ax)->segSph.x / Nlm_stCon.a[1][0] +
188 			((Nlm_PSeg3DPtr)ax)->segSph.y / Nlm_stCon.a[1][1] +
189 			((Nlm_PSeg3DPtr)ax)->segSph.z / Nlm_stCon.a[1][2] +
190 			Nlm_stCon.c[1];
191   bx = Nlm_stCon.height>>1;
192   spy -= bx;
193   bx = bx Y_PLUS (spy*Nlm_stCon.zmaxPersp)/(Nlm_stCon.zmaxPersp1-spz);
194   if ( (Nlm_stCon.ymin > (bx + rad)) || (Nlm_stCon.ymax < (bx - rad)) )
195 	 return;
196   ax = (long)(((Nlm_PSeg3DPtr)ax)->first);
197   while ( ax ){
198 	 if ( Nlm_stCon.layerTable[((Nlm_Base3DPtr)ax)->layer] ){
199 		((Nlm_Base3DPtr)ax)->fTable->hittest ( (Nlm_VoidPtr)ax );
200 	 }
201 	 ax = (long)(((Nlm_Base3DPtr)ax)->next);
202   }
203 }
204 
Nlm_Seg3DGetL(Nlm_PSeg3DPtr s)205 static void Nlm_Seg3DGetL ( Nlm_PSeg3DPtr s )
206 {
207   register long ax;
208   register long bx;
209   double        diam;
210 
211   ax = (long)s;
212   ((Nlm_PSeg3DPtr)ax)->segBox.minX = ((Nlm_PSeg3DPtr)ax)->segBox.minY =
213   ((Nlm_PSeg3DPtr)ax)->segBox.minZ = INT4_MAX;
214   ((Nlm_PSeg3DPtr)ax)->segBox.maxX = ((Nlm_PSeg3DPtr)ax)->segBox.maxY =
215   ((Nlm_PSeg3DPtr)ax)->segBox.maxZ = INT4_MIN;
216   ax = (long)(((Nlm_PSeg3DPtr)ax)->first);
217   while ( ax ){
218 	 if ( Nlm_stCon.layerTable[((Nlm_Base3DPtr)ax)->layer] ){
219 		((Nlm_Base3DPtr)ax)->fTable->getlimits ( (Nlm_VoidPtr)ax );
220 	 }
221 	 ax = (long)(((Nlm_Base3DPtr)ax)->next);
222   }
223   ax = (long)s;
224   bx = (long)(((Nlm_PSeg3DPtr)ax)->segBox.maxX -
225 					((Nlm_PSeg3DPtr)ax)->segBox.minX);
226   diam = (double)bx * (double)bx;
227   bx = (long)(((Nlm_PSeg3DPtr)ax)->segBox.maxY -
228 					((Nlm_PSeg3DPtr)ax)->segBox.minY);
229   diam += (double)bx * (double)bx;
230   bx = (long)(((Nlm_PSeg3DPtr)ax)->segBox.maxZ -
231 					((Nlm_PSeg3DPtr)ax)->segBox.minZ);
232   diam += (double)bx * (double)bx;
233   diam = sqrt ( diam );
234   ((Nlm_PSeg3DPtr)ax)->segSph.radius = (long)(diam/2.0) + 1;
235   ((Nlm_PSeg3DPtr)ax)->segSph.x = (((Nlm_PSeg3DPtr)ax)->segBox.maxX +
236                             ((Nlm_PSeg3DPtr)ax)->segBox.minX)>>1 ;
237   ((Nlm_PSeg3DPtr)ax)->segSph.y = (((Nlm_PSeg3DPtr)ax)->segBox.maxY +
238                             ((Nlm_PSeg3DPtr)ax)->segBox.minY)>>1 ;
239   ((Nlm_PSeg3DPtr)ax)->segSph.z = (((Nlm_PSeg3DPtr)ax)->segBox.maxZ +
240                             ((Nlm_PSeg3DPtr)ax)->segBox.minZ)>>1 ;
241   ax = (long)s;
242   bx = (long)(((Nlm_PSeg3DPtr)ax)->base.parent);
243   if ( bx ){
244 	 if (((Nlm_PSeg3DPtr)bx)->segBox.minX > ((Nlm_PSeg3DPtr)ax)->segBox.minX)
245 		((Nlm_PSeg3DPtr)bx)->segBox.minX = ((Nlm_PSeg3DPtr)ax)->segBox.minX;
246 	 if (((Nlm_PSeg3DPtr)bx)->segBox.minY > ((Nlm_PSeg3DPtr)ax)->segBox.minY)
247 		((Nlm_PSeg3DPtr)bx)->segBox.minY = ((Nlm_PSeg3DPtr)ax)->segBox.minY;
248 	 if (((Nlm_PSeg3DPtr)bx)->segBox.minZ > ((Nlm_PSeg3DPtr)ax)->segBox.minZ)
249 		((Nlm_PSeg3DPtr)bx)->segBox.minZ = ((Nlm_PSeg3DPtr)ax)->segBox.minZ;
250 	 if (((Nlm_PSeg3DPtr)bx)->segBox.maxX < ((Nlm_PSeg3DPtr)ax)->segBox.maxX)
251 		((Nlm_PSeg3DPtr)bx)->segBox.maxX = ((Nlm_PSeg3DPtr)ax)->segBox.maxX;
252 	 if (((Nlm_PSeg3DPtr)bx)->segBox.maxY < ((Nlm_PSeg3DPtr)ax)->segBox.maxY)
253 		((Nlm_PSeg3DPtr)bx)->segBox.maxY = ((Nlm_PSeg3DPtr)ax)->segBox.maxY;
254 	 if (((Nlm_PSeg3DPtr)bx)->segBox.maxZ < ((Nlm_PSeg3DPtr)ax)->segBox.maxZ)
255 		((Nlm_PSeg3DPtr)bx)->segBox.maxZ = ((Nlm_PSeg3DPtr)ax)->segBox.maxZ;
256   }
257 }
258 
Nlm_Seg3DClean(Nlm_PSeg3DPtr s)259 static void Nlm_Seg3DClean ( Nlm_PSeg3DPtr s )
260 {
261   register long ax;
262   register long bx;
263 
264   ax = (long)(s->first);
265   while ( ax ){
266 	 ((Nlm_Base3DPtr)ax)->fTable->cleanup ( (Nlm_VoidPtr)ax );
267 	 bx = (long)(((Nlm_Base3DPtr)ax)->next);
268 	 MemFree ( (Nlm_VoidPtr)ax );
269 	 ax = bx;
270   }
271 }
272 
273 static Nlm_PrimDef3D segmentDef = {
274   (Nlm_PrimDraw3D)Nlm_Seg3DDraw,
275   (Nlm_PrimHitTest3D)Nlm_Seg3DHitT,
276   (Nlm_PrimGetLimits3D)Nlm_Seg3DGetL,
277   (Nlm_PrimCleanup3D)Nlm_Seg3DClean,
278   (Nlm_Int2)0
279 };
280 
Nlm_CreatePicture3D(void)281 Nlm_Picture3D Nlm_CreatePicture3D ( void )
282 {
283   register Nlm_PPict3DPtr p;
284   Int2 i;
285 
286   Nlm_DiagReset ();
287   p = (Nlm_PPict3DPtr)MemNew ( sizeof(Nlm_PPict3D) );
288   if ( p == NULL ) {
289 	 Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass, "CreatePicture3D",
290 								"Memory allocation error" );
291 	 return NULL;
292   }
293   for (i=0;i<256;i++) p->layerTable[i] = TRUE;
294   p->seg.base.fTable = &segmentDef;
295   return (Nlm_Picture3D)p;
296 }
297 
Nlm_DeletePicture3D(Nlm_Picture3D pic)298 void Nlm_DeletePicture3D ( Nlm_Picture3D pic )
299 {
300   Nlm_ResetPicture3D ( pic );
301   MemFree ( pic );
302 }
303 
Nlm_ResetPicture3D(Nlm_Picture3D pic)304 void Nlm_ResetPicture3D ( Nlm_Picture3D pic )
305 {
306   register Nlm_PPict3DPtr p;
307   Int2 i;
308 
309   Nlm_DiagReset ();
310   Nlm_stCon.pic = pic;
311   p = (Nlm_PPict3DPtr)pic;
312   p->seg.base.fTable->cleanup ( (Nlm_VoidPtr)&(p->seg) );
313   for (i=0;i<256;i++) {
314     p->layerTable[i] = TRUE;
315     p->colorR[i] = p->colorG[i] = p->colorB[i] = 0;
316   }
317   p->totalColors = 0;
318   p->version++;
319 }
320 
Nlm_AllocPalette3D(Nlm_Picture3D pic,Uint1 totalColors)321 Boolean Nlm_AllocPalette3D ( Nlm_Picture3D pic, Uint1 totalColors )
322 {
323   register Nlm_PPict3DPtr p;
324 
325   Nlm_DiagReset ();
326   p = (Nlm_PPict3DPtr)pic;
327   if ( p->totalColors != 0 ) {
328 	 Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass, "AllocPalette3D",
329 	                     "Palette is allocated already" );
330 	 return FALSE;
331   }
332   p->totalColors = totalColors;
333   p->version++;
334   return TRUE;
335 }
336 
Nlm_SetColor3D(Nlm_Picture3D pic,Uint1 color,Uint1 red,Uint1 green,Uint1 blue)337 Boolean Nlm_SetColor3D ( Nlm_Picture3D pic, Uint1 color,
338                          Uint1 red, Uint1 green, Uint1 blue )
339 {
340   register Nlm_PPict3DPtr p;
341 
342   Nlm_DiagReset ();
343   p = (Nlm_PPict3DPtr)pic;
344   if ( p->totalColors <= color ) {
345     Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass, "SetColor3D",
346                         "Color index is out of range" );
347     return FALSE;
348   }
349   p->colorR[color] = red;
350   p->colorG[color] = green;
351   p->colorB[color] = blue;
352   p->version++;
353   return TRUE;
354 }
355 
Nlm_GetColor3D(Nlm_Picture3D pic,Uint1 color,Uint1Ptr red,Uint1Ptr green,Uint1Ptr blue)356 Boolean Nlm_GetColor3D ( Nlm_Picture3D pic, Uint1 color,
357                          Uint1Ptr red, Uint1Ptr green, Uint1Ptr blue )
358 {
359   register Nlm_PPict3DPtr p;
360 
361   Nlm_DiagReset ();
362   p = (Nlm_PPict3DPtr)pic;
363   if ( p->totalColors <= color ) {
364     Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass, "SetColor3D",
365                         "Color index is out of range" );
366     return FALSE;
367   }
368   *red = p->colorR[color];
369   *green = p->colorG[color];
370   *blue = p->colorB[color];
371   return TRUE;
372 }
373 
Nlm_SetLayer3D(Nlm_Picture3D pic,Uint1 layer,Boolean layerOn)374 void Nlm_SetLayer3D ( Nlm_Picture3D pic, Uint1 layer, Boolean layerOn )
375 {
376   register Nlm_PPict3DPtr p;
377 
378   Nlm_DiagReset ();
379   p = (Nlm_PPict3DPtr)pic;
380 /*  if ( layer == (Uint1)0 ){
381     if ( !layerOn ) Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass,
382                     "SetLayer3D",
383                     "Can not switch OFF layer 0" );
384   } else {
385 */
386     p->layerTable[layer] = layerOn;
387     p->version++;
388 /*  } */
389 }
390 
Nlm_GetLayerStatus3D(Nlm_Picture3D pic,Uint1 layer)391 Boolean Nlm_GetLayerStatus3D ( Nlm_Picture3D pic, Uint1 layer )
392 {
393   register Nlm_PPict3DPtr p;
394 
395   Nlm_DiagReset ();
396   p = (Nlm_PPict3DPtr)pic;
397   return p->layerTable[layer];
398 }
399 
Nlm_AddSegment3D(Nlm_Picture3D pic,Nlm_Segment3D parent,BigScalar userData,Uint1 layer)400 Nlm_Segment3D Nlm_AddSegment3D ( Nlm_Picture3D pic, Nlm_Segment3D parent,
401                                  BigScalar userData, Uint1 layer )
402 {
403   register Nlm_PSeg3DPtr  s;
404   register Nlm_PPict3DPtr p;
405 
406   Nlm_DiagReset ();
407   Nlm_stCon.pic = pic;
408   p = (Nlm_PPict3DPtr)pic;
409   s = (Nlm_PSeg3DPtr)MemNew ( sizeof(Nlm_PSeg3D) );
410   if ( s == NULL ){
411     Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass, "AddSegment3D",
412                        "Memory allocation error" );
413     return NULL;
414   }
415   s->base.fTable = &segmentDef;
416   s->base.userData = userData;
417   s->base.layer = layer;
418   if ( parent == NULL ){
419     Nlm_AddToSeg ( &(p->seg), (Nlm_Base3DPtr)s );
420   } else {
421     Nlm_AddToSeg ( (Nlm_PSeg3DPtr)parent, (Nlm_Base3DPtr)s );
422   }
423   p->version++;
424   return (Nlm_Segment3D)s;
425 }
426 
Nlm_GetSegmentInfo3D(Nlm_Picture3D pic,Nlm_Segment3D segment,BigScalar PNTR userData,Uint1Ptr layer,Nlm_Segment3D PNTR parent)427 void Nlm_GetSegmentInfo3D ( Nlm_Picture3D pic, Nlm_Segment3D segment,
428                             BigScalar PNTR userData,  Uint1Ptr layer,
429                             Nlm_Segment3D PNTR parent )
430 {
431   register Nlm_PSeg3DPtr  s;
432 
433   Nlm_DiagReset ();
434   s = (Nlm_PSeg3DPtr)segment;
435   if ( userData != NULL ) *userData = s->base.userData;
436   if ( layer != NULL ) *layer = s->base.layer;
437   if ( parent != NULL ) {
438     if ( s->base.parent == (Nlm_Base3DPtr)&(((Nlm_PPict3DPtr)pic)->seg) ){
439       *parent = NULL;
440     } else {
441       *parent = (Nlm_Segment3D)s->base.parent;
442     }
443   }
444 }
445 
446 
Nlm_GetSegSphere3D(Nlm_Picture3D pic,Nlm_Segment3D segment,Nlm_Spher3DPtr sph)447 Nlm_Boolean Nlm_GetSegSphere3D (Nlm_Picture3D pic, Nlm_Segment3D segment,
448                                 Nlm_Spher3DPtr sph)
449 {
450   register Nlm_PSeg3DPtr seg = (Nlm_PSeg3DPtr)segment;
451 
452   Nlm_DiagReset ();
453   if (seg == NULL)  {
454     if ( !Nlm_UpdateGver( (Nlm_PPict3DPtr)pic ) )
455       return FALSE;
456     seg = &((Nlm_PPict3DPtr)pic)->seg;
457   }
458 
459   if (sph != NULL)
460     *sph = seg->segSph;
461   return TRUE;
462 }
463 
464 
Nlm_GetSegBox3D(Nlm_Picture3D pic,Nlm_Segment3D segment,Nlm_Box3DPtr box)465 Nlm_Boolean Nlm_GetSegBox3D (Nlm_Picture3D pic, Nlm_Segment3D segment,
466                              Nlm_Box3DPtr box)
467 {
468   register Nlm_PSeg3DPtr seg = (Nlm_PSeg3DPtr)segment;
469 
470   Nlm_DiagReset ();
471   if (seg == NULL)  {
472     if ( !Nlm_UpdateGver( (Nlm_PPict3DPtr)pic ) )
473       return FALSE;
474     seg = &((Nlm_PPict3DPtr)pic)->seg;
475   }
476 
477   if (box != NULL)
478     *box = seg->segBox;
479   return TRUE;
480 }
481 
482 
Nlm_ChangeSegment3D(Nlm_Picture3D pic,Nlm_Segment3D segment,BigScalar userData,Uint1 layer)483 void Nlm_ChangeSegment3D ( Nlm_Picture3D pic, Nlm_Segment3D segment,
484                            BigScalar userData, Uint1 layer )
485 {
486   register Nlm_PSeg3DPtr  s;
487 
488   Nlm_DiagReset ();
489   s = (Nlm_PSeg3DPtr)segment;
490   s->base.userData = userData;
491   s->base.layer = layer;
492   ((Nlm_PPict3DPtr)pic)->version++;
493 }
494 
Nlm_DeleteSegment3D(Nlm_Picture3D pic,Nlm_Segment3D segment)495 void Nlm_DeleteSegment3D ( Nlm_Picture3D pic, Nlm_Segment3D segment )
496 {
497   register Nlm_PSeg3DPtr  s;
498 
499   Nlm_DiagReset ();
500   Nlm_stCon.pic = pic;
501   s = (Nlm_PSeg3DPtr)segment;
502   s->base.fTable->cleanup ( (Nlm_VoidPtr)s );
503   Nlm_DeleteFromSeg ( (Nlm_PSeg3DPtr)s->base.parent, (Nlm_Base3DPtr)s );
504   MemFree ( s );
505   ((Nlm_PPict3DPtr)pic)->version++;
506 }
507 
Nlm_GetPrimInfo3D(Nlm_Picture3D pic,Nlm_Prim3D prim,BigScalar PNTR userData,Uint1Ptr layer,Uint1Ptr color,Nlm_Segment3D PNTR parent,Uint2Ptr primType)508 void Nlm_GetPrimInfo3D ( Nlm_Picture3D pic, Nlm_Prim3D prim,
509                          BigScalar PNTR userData, Uint1Ptr layer, Uint1Ptr color,
510                          Nlm_Segment3D PNTR parent, Uint2Ptr primType )
511 {
512   register Nlm_Base3DPtr p;
513 
514   Nlm_DiagReset ();
515   p = (Nlm_Base3DPtr)prim;
516   if ( userData != NULL ) *userData = p->userData;
517   if ( layer != NULL ) *layer = p->layer;
518   if ( color != NULL ) *color = p->color;
519   if ( parent != NULL ) {
520     if ( p->parent == (Nlm_Base3DPtr)&(((Nlm_PPict3DPtr)pic)->seg) ){
521       *parent = NULL;
522     } else {
523       *parent = (Nlm_Segment3D)p->parent;
524     }
525   }
526   if ( primType != NULL ) *primType = p->fTable->code;
527 }
528 
Nlm_ChangePrim3D(Nlm_Picture3D pic,Nlm_Prim3D prim,BigScalar userData,Uint1 layer,Uint1 color)529 void Nlm_ChangePrim3D ( Nlm_Picture3D pic, Nlm_Prim3D prim, BigScalar userData,
530                         Uint1 layer, Uint1 color )
531 {
532   register Nlm_Base3DPtr p;
533 
534   Nlm_DiagReset ();
535   p = (Nlm_Base3DPtr)prim;
536   p->userData = userData;
537   p->layer = layer;
538   p->color = color;
539   ((Nlm_PPict3DPtr)pic)->version++;
540 }
541 
Nlm_DeletePrim3D(Nlm_Picture3D pic,Nlm_Prim3D prim)542 void Nlm_DeletePrim3D ( Nlm_Picture3D pic, Nlm_Prim3D prim )
543 {
544   register Nlm_Base3DPtr p;
545 
546   Nlm_DiagReset ();
547   Nlm_stCon.pic = pic;
548   p = (Nlm_Base3DPtr)prim;
549   p->fTable->cleanup ( (Nlm_VoidPtr)p );
550   Nlm_DeleteFromSeg ( (Nlm_PSeg3DPtr)p->parent, (Nlm_Base3DPtr)p );
551   MemFree ( p );
552   ((Nlm_PPict3DPtr)pic)->version++;
553 }
554 
Nlm_AddPrim3D(Nlm_PSeg3DPtr seg,Nlm_Base3DPtr prim,size_t pSize,CharPtr funName)555 Nlm_Base3DPtr Nlm_AddPrim3D ( Nlm_PSeg3DPtr seg, Nlm_Base3DPtr prim,
556                               size_t pSize, CharPtr funName )
557 {
558   register Nlm_Base3DPtr p;
559   Nlm_PPict3DPtr         pic;
560 
561   pic = (Nlm_PPict3DPtr)Nlm_stCon.pic;
562   if ( (long)prim->color > (long)pic->totalColors ){
563     Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass, funName,
564                         "Color is out of range" );
565     return NULL;
566   }
567   p = (Nlm_Base3DPtr)MemNew ( pSize );
568   if ( p == NULL ){
569     Nlm_DiagPutRecord ( DA_ERROR, Pict3Dclass, funName,
570                         "Memory allocation error" );
571     return NULL;
572   }
573   MemCopy ( p, prim, pSize );
574   if ( seg == NULL ){
575     Nlm_AddToSeg ( &(pic->seg), p );
576   } else {
577     Nlm_AddToSeg ( seg, p );
578   }
579   pic->version++;
580   return p;
581 }
582 
Nlm_UpdateGver(Nlm_PPict3DPtr pic)583 Nlm_Boolean Nlm_UpdateGver ( Nlm_PPict3DPtr pic )
584 {
585   register Nlm_PPict3DPtr p = pic;
586   if (p == NULL)
587     return FALSE;
588 
589   Nlm_stCon.pic = (Nlm_Picture3D)p;
590   if ( p->version != p->versionPrev ){
591     p->seg.base.fTable->getlimits ( (Nlm_VoidPtr)&(p->seg) );
592     p->versionPrev = p->version;
593   }
594 
595   {{
596     Nlm_Boolean empty = (Nlm_Boolean)
597       (p->seg.segBox.minX == INT4_MAX  &&  p->seg.segBox.maxX == INT4_MIN  &&
598        p->seg.segBox.minY == INT4_MAX  &&  p->seg.segBox.maxY == INT4_MIN  &&
599        p->seg.segBox.minZ == INT4_MAX  &&  p->seg.segBox.maxZ == INT4_MIN);
600 
601     return (Nlm_Boolean)( !empty );
602   }}
603 }
604 
605