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