changed variables and pointer carrying vertex indexes from short to int to handle levels with over 900 segments properly

This commit is contained in:
zicodxx 2011-06-30 12:23:38 +02:00
parent 775ad16622
commit 8a6839e8a1
16 changed files with 72 additions and 69 deletions

View file

@ -1,5 +1,9 @@
D2X-Rebirth Changelog
20110630
--------
editor/group.c, editor/ksegsize.c, editor/meddraw.c, editor/segment.c, editor/seguvs.c, include/editor/editor.h, main/automap.c, main/fireball.c, main/gamecntl.c, main/gameseg.c, main/gameseg.h, main/lighting.c, main/render.c, main/render.h, main/segment.h: changed variables and pointer carrying vertex indexes from short to int to handle levels with over 900 segments properly
20110628
--------
main/state.c: Fixed possible memory corruption when saving Current_mission_filename which is not necessarily a 9 byte long allocated string; Bit safer string handling with snprintf; Fixed set but unused variables like a boss

View file

@ -443,7 +443,7 @@ void duplicate_group(sbyte *vertex_ids, short *segment_ids, int num_segments)
{
int v,s,ss,new_vertex_id,new_segment_id,sidenum;
short new_segment_ids[MAX_SEGMENTS];
short new_vertex_ids[MAX_VERTICES]; // If new_vertex_ids[v] != -1, then vertex v has been remapped to new_vertex_ids[v]
int new_vertex_ids[MAX_VERTICES]; // If new_vertex_ids[v] != -1, then vertex v has been remapped to new_vertex_ids[v]
short new_object_ids[MAX_OBJECTS];
// duplicate vertices
@ -1046,7 +1046,7 @@ static char current_tmap_list[MAX_TEXTURES][13];
// and new_segment in that order, marking their file offset.
// 2. Go through all the fields and fill in the offset, size, and sizeof
// values in the headers.
int med_save_group( char *filename, short *vertex_ids, short *segment_ids, int num_vertices, int num_segments)
int med_save_group( char *filename, int *vertex_ids, short *segment_ids, int num_vertices, int num_segments)
{
PHYSFS_file * SaveFile;
int header_offset, editor_offset, vertex_offset, segment_offset, texture_offset;
@ -1184,7 +1184,7 @@ static char old_tmap_list[MAX_TEXTURES][13];
// -----------------------------------------------------------------------------
// Load group will:
//int med_load_group(char * filename)
int med_load_group( char *filename, short *vertex_ids, short *segment_ids, int *num_vertices, int *num_segments)
int med_load_group( char *filename, int *vertex_ids, short *segment_ids, int *num_vertices, int *num_segments)
{
int segnum, vertnum;
char ErrorMessage[200];

View file

@ -45,7 +45,7 @@ void validate_modified_segments(void)
v0 = Modified_vertices[v];
for (seg = 0; seg <= Highest_segment_index; seg++) {
short *vp = Segments[seg].verts;
int *vp = Segments[seg].verts;
if (Segments[seg].segnum != -1)
for (w=0; w<MAX_VERTICES_PER_SEGMENT; w++)
if (*vp++ == v0)

View file

@ -95,7 +95,7 @@ void draw_line(int pnum0,int pnum1)
// ----------------------------------------------------------------------------
void draw_segment(segment *seg)
{
short *svp;
int *svp;
int nv;
g3s_codes cc;
@ -125,7 +125,7 @@ void draw_segment(segment *seg)
//for looking for segment under a mouse click
void check_segment(segment *seg)
{
short *svp;
int *svp;
int nv;
g3s_codes cc;
@ -166,7 +166,7 @@ void check_segment(segment *seg)
// ----------------------------------------------------------------------------
void draw_seg_side(segment *seg,int side)
{
short *svp;
int *svp;
int nv;
g3s_codes cc;
@ -186,7 +186,7 @@ void draw_seg_side(segment *seg,int side)
void draw_side_edge(segment *seg,int side,int edge)
{
short *svp;
int *svp;
int nv;
g3s_codes cc;
@ -217,7 +217,7 @@ int edge_colors[] = { 54, 59, 64 };
typedef struct seg_edge {
union {
struct {short v0,v1;} __pack__ n;
struct {int v0,v1;} __pack__ n;
long vv;
}v;
ushort type;
@ -228,7 +228,7 @@ typedef struct seg_edge {
seg_edge edge_list[MAX_EDGES];
short used_list[MAX_EDGES]; //which entries in edge_list have been used
int used_list[MAX_EDGES]; //which entries in edge_list have been used
int n_used;
int edge_list_size; //set each frame
@ -236,7 +236,7 @@ int edge_list_size; //set each frame
#define HASH(a,b) ((a*5+b) % edge_list_size)
//define edge numberings
short edges[] = {
int edges[] = {
0*8+1, // edge 0
0*8+3, // edge 1
0*8+4, // edge 2
@ -277,8 +277,8 @@ short edges[] = {
int find_edge_num(int v0,int v1)
{
int i;
short vv;
short *edgep = edges;
int vv;
int *edgep = edges;
if (v0 > v1) swap(v0,v1);
@ -301,7 +301,7 @@ int find_edge_num(int v0,int v1)
int find_edge(int v0,int v1,seg_edge **edge_ptr)
{
long vv;
short hash,oldhash;
int hash,oldhash;
int ret;
vv = (v1<<16) + v0;
@ -363,7 +363,7 @@ void add_edge(int v0,int v1,ubyte type)
//adds a segment's edges to the edge list
void add_edges(segment *seg)
{
short *svp;
int *svp;
int nv;
g3s_codes cc;
@ -428,7 +428,7 @@ void add_edges(segment *seg)
// ----------------------------------------------------------------------------
void draw_trigger_side(segment *seg,int side)
{
short *svp;
int *svp;
int nv;
g3s_codes cc;
@ -445,7 +445,7 @@ void draw_trigger_side(segment *seg,int side)
// ----------------------------------------------------------------------------
void draw_wall_side(segment *seg,int side)
{
short *svp;
int *svp;
int nv;
g3s_codes cc;
@ -721,7 +721,7 @@ void free_vert(int vert_num)
void draw_coordinate_axes(void)
{
int i;
short Axes_verts[16];
int Axes_verts[16];
vms_vector tvec,xvec,yvec,zvec;
for (i=0; i<16; i++)

View file

@ -249,7 +249,7 @@ int ToggleBottom(void)
// ----------------------------------------------------------------------------
// Return a pointer to the list of vertex indices for the current segment in vp and
// the number of vertices in *nv.
void med_get_vertex_list(segment *s,int *nv,short **vp)
void med_get_vertex_list(segment *s,int *nv,int **vp)
{
*vp = s->verts;
*nv = MAX_VERTICES_PER_SEGMENT;
@ -1018,7 +1018,7 @@ int med_attach_segment(segment *destseg, segment *newseg, int destside, int news
// -------------------------------------------------------------------------------
// Delete a vertex, sort of.
// Decrement the vertex count. If the count goes to 0, then the vertex is free (has been deleted).
void delete_vertex(short v)
void delete_vertex(int v)
{
Assert(v < MAX_VERTICES); // abort if vertex is not in array Vertices
Assert(Vertex_active[v] >= 1); // abort if trying to delete a non-existent vertex
@ -1754,7 +1754,7 @@ void med_copy_segment(segment *dsp,segment *ssp)
// -----------------------------------------------------------------------------
// Create coordinate axes in orientation of specified segment, stores vertices at *vp.
void create_coordinate_axes_from_segment(segment *sp,short *vertnums)
void create_coordinate_axes_from_segment(segment *sp,int *vertnums)
{
vms_matrix rotmat;
vms_vector t;

View file

@ -117,7 +117,7 @@ fix get_average_light_at_vertex(int vnum, short *segs)
for (segnum=0; segnum<=Highest_segment_index; segnum++) {
segment *segp = &Segments[segnum];
short *vp = segp->verts;
int *vp = segp->verts;
for (relvnum=0; relvnum<MAX_VERTICES_PER_SEGMENT; relvnum++)
if (*vp++ == vnum)
@ -1046,7 +1046,7 @@ found1: ;
void propagate_tmaps_to_segment_sides(segment *base_seg, int base_side, segment *con_seg, int con_side, int uv_only_flag)
{
sbyte *base_vp,*con_vp;
short abs_id1,abs_id2;
int abs_id1,abs_id2;
int v;
base_vp = Side_to_verts[base_side];

View file

@ -294,14 +294,14 @@ extern int med_save_mine(char *name);
// Returns:
// 0 = successfully loaded.
// 1 = unable to load.
extern int med_load_group( char *filename, short *vertex_ids, short *segment_ids, int *num_vertices, int *num_segments);
extern int med_load_group( char *filename, int *vertex_ids, short *segment_ids, int *num_vertices, int *num_segments);
// Saves group *filename from disk.
// Saves group defined by vertex_ids and segment_ids to disk.
// Returns:
// 0 = successfully saved.
// 1 = unable to save.
extern int med_save_group( char *filename, short *vertex_ids, short *segment_ids, int num_vertices, int num_segments);
extern int med_save_group( char *filename, int *vertex_ids, short *segment_ids, int num_vertices, int num_segments);
// Updates the screen... (I put the prototype here for curves.c)
extern int medlisp_update_screen();
@ -431,7 +431,7 @@ extern void med_assign_uvs_to_side(segment *con_seg, int con_common_side, segmen
extern void show_matrix(char *s,vms_matrix *mp,int type);
// Create coordinate axes in orientation of specified segment, stores vertices at *vp.
extern void create_coordinate_axes_from_segment(segment *sp,short *vertnums);
extern void create_coordinate_axes_from_segment(segment *sp,int *vertnums);
// Scale a segment. Then, if it is connected to something, rotate it.
extern int med_scale_and_rotate_segment(segment *seg, vms_angvec *rot);

View file

@ -84,12 +84,12 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define EF_TOO_FAR 64 // An edge that is too far away
typedef struct Edge_info {
short verts[2]; // 4 bytes
ubyte sides[4]; // 4 bytes
short segnum[4]; // 8 bytes // This might not need to be stored... If you can access the normals of a side.
ubyte flags; // 1 bytes // See the EF_??? defines above.
ubyte color; // 1 bytes
ubyte num_faces; // 1 bytes // 19 bytes...
int verts[2]; // 8 bytes
ubyte sides[4]; // 4 bytes
int segnum[4]; // 16 bytes // This might not need to be stored... If you can access the normals of a side.
ubyte flags; // 1 bytes // See the EF_??? defines above.
ubyte color; // 1 bytes
ubyte num_faces; // 1 bytes // 31 bytes...
} Edge_info;
typedef struct automap
@ -108,7 +108,7 @@ typedef struct automap
int max_edges; //set each frame
int highest_edge_index;
Edge_info *edges;
short *drawingListBright;
int *drawingListBright;
// Screen canvas variables
grs_canvas automap_view;
@ -856,7 +856,7 @@ void do_automap( int key_code )
am->highest_edge_index = -1;
am->max_edges = Num_segments*12;
MALLOC(am->edges, Edge_info, am->max_edges);
MALLOC(am->drawingListBright, short, am->max_edges);
MALLOC(am->drawingListBright, int, am->max_edges);
if (!am->edges || !am->drawingListBright)
{
if (am->edges)
@ -1077,7 +1077,7 @@ void draw_all_edges(automap *am)
static int automap_find_edge(automap *am, int v0,int v1,Edge_info **edge_ptr)
{
long vv, evv;
short hash,oldhash;
int hash, oldhash;
int ret, ev0, ev1;
vv = (v1<<16) + v0;
@ -1087,8 +1087,8 @@ static int automap_find_edge(automap *am, int v0,int v1,Edge_info **edge_ptr)
ret = -1;
while (ret==-1) {
ev0 = (int)(am->edges[hash].verts[0]);
ev1 = (int)(am->edges[hash].verts[1]);
ev0 = am->edges[hash].verts[0];
ev1 = am->edges[hash].verts[1];
evv = (ev1<<16)+ev0;
if (am->edges[hash].num_faces == 0 ) ret=0;
else if (evv == vv) ret=1;
@ -1108,10 +1108,10 @@ static int automap_find_edge(automap *am, int v0,int v1,Edge_info **edge_ptr)
}
void add_one_edge( automap *am, short va, short vb, ubyte color, ubyte side, short segnum, int hidden, int grate, int no_fade ) {
void add_one_edge( automap *am, int va, int vb, ubyte color, ubyte side, int segnum, int hidden, int grate, int no_fade ) {
int found;
Edge_info *e;
short tmp;
int tmp;
if ( am->num_edges >= am->max_edges) {
// GET JOHN! (And tell him that his
@ -1165,11 +1165,11 @@ void add_one_edge( automap *am, short va, short vb, ubyte color, ubyte side, sho
e->flags |= EF_NO_FADE;
}
void add_one_unknown_edge( automap *am, short va, short vb )
void add_one_unknown_edge( automap *am, int va, int vb )
{
int found;
Edge_info *e;
short tmp;
int tmp;
if ( va > vb ) {
tmp = va;
@ -1196,7 +1196,7 @@ void add_segment_edges(automap *am, segment *seg)
int ttype,trigger_num;
for (sn=0;sn<MAX_SIDES_PER_SEGMENT;sn++) {
short vertex_list[4];
int vertex_list[4];
hidden_flag = 0;
@ -1313,7 +1313,7 @@ void add_unknown_segment_edges(automap *am, segment *seg)
int segnum = seg-Segments;
for (sn=0;sn<MAX_SIDES_PER_SEGMENT;sn++) {
short vertex_list[4];
int vertex_list[4];
// Only add edges that have no children
if (seg->children[sn] == -1) {

View file

@ -1336,7 +1336,7 @@ void do_exploding_wall_frame()
//now create all the next explosions
for (e=old_count;e<new_count;e++) {
short vertnum_list[4];
int vertnum_list[4];
vms_vector *v0,*v1,*v2;
vms_vector vv0,vv1,pos;
fix size;

View file

@ -1453,7 +1453,6 @@ int HandleTestKey(int key)
#endif
Function_mode = FMODE_EDITOR;
keyd_editor_mode = 1;
editor();
if ( Function_mode == FMODE_GAME ) {
Game_mode = GM_EDITOR;

View file

@ -111,11 +111,11 @@ int get_num_faces(side *sidep)
}
// Fill in array with four absolute point numbers for a given side
void get_side_verts(short *vertlist,int segnum,int sidenum)
void get_side_verts(int *vertlist,int segnum,int sidenum)
{
int i;
sbyte *sv = Side_to_verts[sidenum];
short *vp = Segments[segnum].verts;
int *vp = Segments[segnum].verts;
for (i=4; i--;)
vertlist[i] = vp[sv[i]];
@ -249,7 +249,7 @@ void create_all_vertnum_lists(int *num_faces, int *vertnums, int segnum, int sid
// like create_all_vertex_lists(), but generate absolute point numbers
void create_abs_vertex_lists(int *num_faces, int *vertices, int segnum, int sidenum, char *calling_file, int calling_linenum)
{
short *vp = Segments[segnum].verts;
int *vp = Segments[segnum].verts;
side *sidep = &Segments[segnum].sides[sidenum];
int *sv = Side_to_verts_int[sidenum];

View file

@ -44,7 +44,7 @@ extern void compute_segment_center(vms_vector *vp,segment *sp);
extern int find_connect_side(segment *base_seg, segment *con_seg);
// Fill in array with four absolute point numbers for a given side
void get_side_verts(short *vertlist,int segnum,int sidenum);
void get_side_verts(int *vertlist,int segnum,int sidenum);
// Create all vertex lists (1 or 2) for faces on a side.
// Sets:

View file

@ -126,7 +126,7 @@ Cache_hits++;
#define HEADLIGHT_SCALE (F1_0*10)
// ----------------------------------------------------------------------------------------------
void apply_light(g3s_lrgb obj_light_emission, int obj_seg, vms_vector *obj_pos, int n_render_vertices, short *render_vertices, int objnum)
void apply_light(g3s_lrgb obj_light_emission, int obj_seg, vms_vector *obj_pos, int n_render_vertices, int *render_vertices, int objnum)
{
int vv;
@ -137,7 +137,7 @@ void apply_light(g3s_lrgb obj_light_emission, int obj_seg, vms_vector *obj_pos,
// for pretty dim sources, only process vertices in object's own segment.
// 12/04/95, MK, markers only cast light in own segment.
if ((abs(obji_64) <= F1_0*8) || (Objects[objnum].type == OBJ_MARKER)) {
short *vp = Segments[obj_seg].verts;
int *vp = Segments[obj_seg].verts;
for (vv=0; vv<MAX_VERTICES_PER_SEGMENT; vv++) {
int vertnum;
@ -266,7 +266,7 @@ void apply_light(g3s_lrgb obj_light_emission, int obj_seg, vms_vector *obj_pos,
#define FLASH_SCALE (3*F1_0/FLASH_LEN_FIXED_SECONDS)
// ----------------------------------------------------------------------------------------------
void cast_muzzle_flash_light(int n_render_vertices, short *render_vertices)
void cast_muzzle_flash_light(int n_render_vertices, int *render_vertices)
{
fix64 current_time;
int i;
@ -522,7 +522,7 @@ void set_dynamic_light(void)
int vv;
int objnum;
int n_render_vertices;
short render_vertices[MAX_VERTICES];
int render_vertices[MAX_VERTICES];
sbyte render_vertex_flags[MAX_VERTICES];
int render_seg,segnum, v;
@ -542,7 +542,7 @@ void set_dynamic_light(void)
for (render_seg=0; render_seg<N_render_segs; render_seg++) {
segnum = Render_list[render_seg];
if (segnum != -1) {
short *vp = Segments[segnum].verts;
int *vp = Segments[segnum].verts;
for (v=0; v<MAX_VERTICES_PER_SEGMENT; v++) {
int vnum = vp[v];
if (vnum<0 || vnum>Highest_vertex_index) {
@ -639,7 +639,7 @@ g3s_lrgb compute_seg_dynamic_light(int segnum)
{
g3s_lrgb sum, seg_lrgb;
segment *seg;
short *verts;
int *verts;
seg = &Segments[segnum];

View file

@ -195,7 +195,7 @@ void flash_frame()
// they are used for our hideously hacked in headlight system.
// vp is a pointer to vertex ids.
// tmap1, tmap2 are texture map ids. tmap2 is the pasty one.
void render_face(int segnum, int sidenum, int nv, short *vp, int tmap1, int tmap2, uvl *uvlp, int wid_flags)
void render_face(int segnum, int sidenum, int nv, int *vp, int tmap1, int tmap2, uvl *uvlp, int wid_flags)
{
// -- Using new headlight system...fix face_light;
grs_bitmap *bm;
@ -347,7 +347,7 @@ void render_face(int segnum, int sidenum, int nv, short *vp, int tmap1, int tmap
// ----------------------------------------------------------------------------
// Only called if editor active.
// Used to determine which face was clicked on.
void check_face(int segnum, int sidenum, int facenum, int nv, short *vp, int tmap1, int tmap2, uvl *uvlp)
void check_face(int segnum, int sidenum, int facenum, int nv, int *vp, int tmap1, int tmap2, uvl *uvlp)
{
int i;
@ -400,7 +400,7 @@ extern fix Obj_light_xlate[16];
// Check for normal facing. If so, render faces on side dictated by sidep->type.
void render_side(segment *segp, int sidenum)
{
short vertnum_list[4];
int vertnum_list[4];
side *sidep = &segp->sides[sidenum];
vms_vector tvec;
fix v_dot_n0, v_dot_n1;
@ -721,7 +721,7 @@ void render_start_frame()
}
//Given a lit of point numbers, rotate any that haven't been rotated this frame
g3s_codes rotate_list(int nv,short *pointnumlist)
g3s_codes rotate_list(int nv,int *pointnumlist)
{
int i,pnum;
g3s_point *pnt;
@ -761,7 +761,7 @@ g3s_codes rotate_list(int nv,short *pointnumlist)
}
//Given a lit of point numbers, project any that haven't been projected
void project_list(int nv,short *pointnumlist)
void project_list(int nv,int *pointnumlist)
{
int i,pnum;
@ -1028,14 +1028,14 @@ int Edge_to_sides[8][8][2] = {
//given an edge, tell what side is on that edge
int find_seg_side(segment *seg,short *verts,int notside)
int find_seg_side(segment *seg,int *verts,int notside)
{
int i;
int vv0=-1,vv1=-1;
int side0,side1;
int *eptr;
int v0,v1;
short *vp;
int *vp;
//@@ check_check();
@ -1085,7 +1085,7 @@ int find_seg_side(segment *seg,short *verts,int notside)
int find_joining_side_norms(vms_vector *norm0_0,vms_vector *norm0_1,vms_vector *norm1_0,vms_vector *norm1_1,vms_vector **pnt0,vms_vector **pnt1,segment *seg,int s0,int s1)
{
segment *seg0,*seg1;
short edge_verts[2];
int edge_verts[2];
int notside0,notside1;
int edgeside0,edgeside1;

View file

@ -93,10 +93,10 @@ void render_start_frame(void);
// Given a list of point numbers, rotate any that haven't been rotated
// this frame
g3s_codes rotate_list(int nv, short *pointnumlist);
g3s_codes rotate_list(int nv, int *pointnumlist);
// Given a list of point numbers, project any that haven't been projected
void project_list(int nv, short *pointnumlist);
void project_list(int nv, int *pointnumlist);
extern void render_mine(int start_seg_num, fix eye_offset, int window_num);

View file

@ -99,7 +99,7 @@ typedef struct segment {
#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
int 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.
short objects; // pointer to objects in this segment
@ -160,7 +160,7 @@ typedef struct {
int num_segments;
int num_vertices;
short segments[MAX_SEGMENTS];
short vertices[MAX_VERTICES];
int vertices[MAX_VERTICES];
} group;
// Globals from mglobal.c
@ -221,11 +221,11 @@ extern ubyte Light_subtracted[MAX_SEGMENTS];
// Return a pointer to the list of vertex indices for the current
// segment in vp and the number of vertices in *nv.
extern void med_get_vertex_list(segment *s,int *nv,short **vp);
extern void med_get_vertex_list(segment *s,int *nv,int **vp);
// Return a pointer to the list of vertex indices for face facenum in
// vp and the number of vertices in *nv.
extern void med_get_face_vertex_list(segment *s,int side, int facenum,int *nv,short **vp);
extern void med_get_face_vertex_list(segment *s,int side, int facenum,int *nv,int **vp);
// Set *nf = number of faces in segment s.
extern void med_get_num_faces(segment *s,int *nf);