home *** CD-ROM | disk | FTP | other *** search
- #ifndef lint
- static char sccsid[] = "@(#)draw_bsp_xgl.c 1.1 92/05/28 SMI" ;
- /* from draw_bsp_xgl.c 1.1 90/07/23 SMI */
- #endif
-
- /*
- * Copyright (c) 1986 by Sun Microsystems, Inc.
- */
-
- /*
- * this file draws a bsp_tree object
- */
-
-
-
- #include <stdio.h>
- #include <math.h>
- #include "graphics.h"
- #include "dstar.h"
- #include "bsp_object.h"
-
- extern int debug_level ;
-
- #define MAX_VECS 50
-
- static Pt3d Pointzero = {0.0, 0.0, 0.0} ;
-
- static int current_color ;
- static int current_pg_color ;
- static Xgl_color pg_color ;
-
-
- #define bsp_color_line(color) if(color != current_color) \
- Set_color(Main_gfx, current_color = color) ;
-
- #define bsp_color_pg(color) if(color != current_pg_color){ \
- pg_color.index = dbmap[current_pg_color = color] ; \
- xgl_object_set(Main_gfx, \
- XGL_CTX_SURF_FRONT_COLOR, &pg_color, 0) ; }
-
-
-
- int
- draw_object_bsp(desc, viewer)
- Object_Desc *desc ;
- Pt3d *viewer;
- {
- Bsp_Node *top ;
- static void fill_vec() ;
- static void draw_node() ;
-
- top = (Bsp_Node *)desc->first ;
- current_color = -1 ;
- draw_node(top, viewer) ;
- }
-
-
-
-
-
-
- static void
- draw_node(node, viewer)
- register Bsp_Node *node ;
- Pt3d *viewer;
- {
- Pt3d vector ;
- int i,j ;
- Xgl_pt_list pl[BSP_MAX_LOOP] ;
-
-
- vector = *viewer ;
- vector.x -= node->vertices->x ;
- vector.y -= node->vertices->y ;
- vector.z -= node->vertices->z ;
-
- if ((vector.x*node->normal.x +
- vector.y*node->normal.y +
- vector.z*node->normal.z ) < 0.0) /* back face */
- {
- if(node->front_child)
- draw_node(node->front_child, viewer) ;
- if(node->flags & BSP_BACK_VIEW)
- {
- for(i=0, j=0; i<node->nloop; ++i)
- {
- pl[i].pt_type = XGL_PT_F3D ;
- pl[i].bbox = NULL ;
- pl[i].num_pts = node->loops[i] ;
- pl[i].pts.f3d = &node->vertices[j] ;
- j += node->loops[i] ;
- }
-
- if(node->color)
- {
- bsp_color_pg(node->color) ;
- xgl_polygon(Main_gfx,XGL_FACET_NONE,NULL,NULL, node->nloop, pl);
- }
- if(node->trimcolor)
- {
- bsp_color_line(node->trimcolor) ;
- xgl_multipolyline(Main_gfx, NULL, node->nloop, pl) ;
- }
- }
- if(node->back_child)
- draw_node(node->back_child, viewer) ;
- }
- else /* front face */
- {
- if(node->back_child)
- draw_node(node->back_child, viewer) ;
- for(i=0, j=0; i<node->nloop; ++i)
- {
- pl[i].pt_type = XGL_PT_F3D ;
- pl[i].bbox = NULL ;
- pl[i].num_pts = node->loops[i] ;
- pl[i].pts.f3d = &node->vertices[j] ;
- j += node->loops[i] ;
- }
-
- if(node->color)
- {
- bsp_color_pg(node->color) ;
- xgl_polygon(Main_gfx,XGL_FACET_NONE,NULL,NULL, node->nloop, pl);
- }
- if(node->trimcolor)
- {
- bsp_color_line(node->trimcolor) ;
- xgl_multipolyline(Main_gfx, NULL, node->nloop, pl) ;
- }
- if(node->front_child)
- draw_node(node->front_child, viewer) ;
- }
- }
-