/* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. */ /* * $Source: /cvsroot/dxx-rebirth/d1x-rebirth/main/segment.h,v $ * $Revision: 1.1.1.1 $ * $Author: zicodxx $ * $Date: 2006/03/17 19:43:14 $ * * Include file for functions which need to access segment data structure. * * $Log: segment.h,v $ * Revision 1.1.1.1 2006/03/17 19:43:14 zicodxx * initial import * * Revision 1.1.1.1 1999/06/14 22:13:07 donut * Import of d1x 1.37 source. * * Revision 2.1 1995/03/20 18:15:22 john * Added code to not store the normals in the segment structure. * * Revision 2.0 1995/02/27 11:26:49 john * New version 2.0, which has no anonymous unions, builds with * Watcom 10.0, and doesn't require parsing BITMAPS.TBL. * * Revision 1.89 1995/01/24 15:07:55 yuan * *** empty log message *** * * Revision 1.88 1994/12/12 01:04:06 yuan * Boosted MAX_GAME_VERTS. * * Revision 1.87 1994/12/11 16:18:14 mike * add constants so we can detect too-large mines for game while in editor. * * Revision 1.86 1994/12/08 15:07:29 yuan * *** empty log message *** * * Revision 1.85 1994/12/01 21:06:39 matt * Moved plane tolerance constant to gameseg.c, the only file that used it. * * Revision 1.84 1994/11/27 14:01:41 matt * Fixed segment structure so LVLs work * * Revision 1.83 1994/11/26 22:50:20 matt * Removed editor-only fields from segment structure when editor is compiled * out, and padded segment structure to even multiple of 4 bytes. * * Revision 1.82 1994/11/21 11:43:36 mike * smaller segment and vertex buffers. * * Revision 1.81 1994/11/17 11:39:35 matt * Ripped out code to load old mines * * Revision 1.80 1994/10/30 14:12:05 mike * rip out local segments stuff. * * Revision 1.79 1994/10/27 11:33:58 mike * lower number of segments by 100, saving 116K. * * Revision 1.78 1994/08/25 21:54:50 mike * Add macro IS_CHILD to make checking for the presence of a child centralized. * * Revision 1.77 1994/08/11 18:58:16 mike * Add prototype for Side_to_verts_int. * * Revision 1.76 1994/08/01 11:04:13 yuan * New materialization centers. * * Revision 1.75 1994/07/25 00:04:19 matt * Various changes to accomodate new 3d, which no longer takes point numbers * as parms, and now only takes pointers to points. * * Revision 1.74 1994/07/21 19:01:30 mike * new lsegment structure. * * Revision 1.73 1994/06/08 14:30:48 matt * Added static_light field to segment structure, and padded side struct * to be longword aligned. * * Revision 1.72 1994/05/19 23:25:17 mike * Change MINE_VERSION to 15, DEFAULT_LIGHTING to 0 * * Revision 1.71 1994/05/12 14:45:54 mike * New segment data structure (!!), group, special, object, value = short. * * Revision 1.70 1994/05/03 11:06:46 mike * Remove constants VMAG and UMAG which are editor specific.. * * Revision 1.69 1994/04/18 10:40:28 yuan * Increased segment limit to 1000 * (From 500) * * */ #ifndef _SEGMENT_H #define _SEGMENT_H #include "types.h" #include "fix.h" #include "vecmat.h" //#include "3d.h" //#include "inferno.h" // Version 1 - Initial version // Version 2 - Mike changed some shorts to bytes in segments, so incompatible! #define SIDE_IS_QUAD 1 // render side as quadrilateral #define SIDE_IS_TRI_02 2 // render side as two triangles, triangulated along edge from 0 to 2 #define SIDE_IS_TRI_13 3 // render side as two triangles, triangulated along edge from 1 to 3 // Set maximum values for segment and face data structures. #define MAX_VERTICES_PER_SEGMENT 8 #define MAX_SIDES_PER_SEGMENT 6 #define MAX_VERTICES_PER_POLY 4 #define WLEFT 0 #define WTOP 1 #define WRIGHT 2 #define WBOTTOM 3 #define WBACK 4 #define WFRONT 5 #define MAX_GAME_SEGMENTS 800 #define MAX_GAME_VERTICES 2800 #if defined(SHAREWARE) && !defined(EDITOR) #define MAX_SEGMENTS MAX_GAME_SEGMENTS #define MAX_SEGMENT_VERTICES MAX_GAME_VERTICES #else #define MAX_SEGMENTS 900 #define MAX_SEGMENT_VERTICES (4*MAX_SEGMENTS) #endif //normal everyday vertices #define DEFAULT_LIGHTING 0 // (F1_0/2) #ifdef EDITOR //verts for the new segment #define NUM_NEW_SEG_VERTICES 8 #define NEW_SEGMENT_VERTICES (MAX_SEGMENT_VERTICES) #define MAX_VERTICES (MAX_SEGMENT_VERTICES+NUM_NEW_SEG_VERTICES) #else //No editor #define MAX_VERTICES (MAX_SEGMENT_VERTICES) #endif // Returns true if segnum references a child, else returns false. // Note that -1 means no connection, -2 means a connection to the outside world. #define IS_CHILD(segnum) (segnum > -1) //Structure for storing u,v,light values. //NOTE: this structure should be the same as the one in 3d.h typedef struct uvl { fix u,v,l; } uvl; #ifdef COMPACT_SEGS typedef struct side { byte type; // replaces num_faces and tri_edge, 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation ubyte pad; //keep us longword alligned short wall_num; short tmap_num; short tmap_num2; uvl uvls[4]; // vms_vector normals[2]; // 2 normals, if quadrilateral, both the same. } __pack__ side; #else typedef struct side { byte type; // replaces num_faces and tri_edge, 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation ubyte pad; //keep us longword alligned short wall_num; short tmap_num; short tmap_num2; uvl uvls[4]; vms_vector normals[2]; // 2 normals, if quadrilateral, both the same. } __pack__ side; #endif typedef struct segment { #ifdef EDITOR short segnum; // segment number, not sure what it means #endif side sides[MAX_SIDES_PER_SEGMENT]; // 6 sides short children[MAX_SIDES_PER_SEGMENT]; // indices of 6 children segments, front, left, top, right, bottom, back short verts[MAX_VERTICES_PER_SEGMENT]; // vertex ids of 4 front and 4 back vertices #ifdef EDITOR short group; // group number to which the segment belongs. #endif short objects; // pointer to objects in this segment ubyte special; // special property of a segment (such as damaging, trigger, etc.) byte matcen_num; // which center segment is associated with. short value; fix static_light; //average static light in segment #ifndef EDITOR short pad; //make structure longword aligned #endif } __pack__ segment; #ifdef COMPACT_SEGS extern void get_side_normal(segment *sp, int sidenum, int normal_num, vms_vector * vm ); extern void get_side_normals(segment *sp, int sidenum, vms_vector * vm1, vms_vector *vm2 ); #endif // Local segment data. // This is stuff specific to a segment that does not need to get written to disk. // This is a handy separation because we can add to this structure without obsoleting // existing data on disk. #define SS_REPAIR_CENTER 0x01 // Bitmask for this segment being part of repair center. //--repair-- typedef struct { //--repair-- int special_type; //--repair-- short special_segment; // if special_type indicates repair center, this is the base of the repair center //--repair-- } lsegment; typedef struct { int num_segments; int num_vertices; short segments[MAX_SEGMENTS]; short vertices[MAX_VERTICES]; } group; // Globals from mglobal.c extern vms_vector Vertices[]; extern segment Segments[]; //--repair-- extern lsegment Lsegments[]; extern int Num_segments; extern int Num_vertices; extern byte Side_to_verts[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side. extern int Side_to_verts_int[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side. extern char Side_opposite[]; // Side_opposite[my_side] returns side opposite cube from my_side. #define SEG_PTR_2_NUM(segptr) (Assert((unsigned) (segptr-Segments)