/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/lib/polymodel_external.h $
* $Revision: 7 $
* $Date: 10/02/01 8:56a $
* $Author: Matt $
*
* Polymodel defines, flags and structs (anything that could be exported to a DLL)
*
* $Log: /DescentIII/Main/lib/polymodel_external.h $
*
* 7 10/02/01 8:56a Matt
* Increased MAX_POLY_MODELS from 1000 to 1200
*
* 6 7/08/99 5:47p Jason
* changes for new bumpmapping system in 1.1 update patch
*
* 5 6/08/99 1:00p Jason
* changes for bumpmapping
*
* 4 4/20/99 1:02p 3dsmax
* fixed polymodel loimt
*
* 3 4/08/99 11:45a Jason
* greatly sped up the time it takes to get model anges/positions by
* precalculation
*
* 2 1/21/99 11:15p Jeff
* pulled out some structs and defines from header files and moved them
* into seperate header files so that multiplayer dlls don't require major
* game headers, just those new headers. Side effect is a shorter build
* time. Also cleaned up some header file #includes that weren't needed.
* This affected polymodel.h, object.h, player.h, vecmat.h, room.h,
* manage.h and multi.h
*
* $NoKeywords: $
*/
#ifndef POLYMODEL_EXTERNAL_H_
#define POLYMODEL_EXTERNAL_H_
#include
#include "grdefs.h"
#include "manage_external.h"
#include "robotfirestruct.h"
#include "vecmat_external.h"
#define MAX_POLY_MODELS 1200
#define MAX_MODEL_TEXTURES 35
#define MAX_POLYGON_VECS 2500
#define MAX_DETAIL_LEVELS 3
#define MAX_PROP_LEN 256
#define MAX_NAME_LEN 32
#define MAX_GROUND_PLANES_PER_MODEL 10
#define MAX_GUNS_PER_MODEL 64
#define MAX_SUBOBJECTS 30
#define MAX_POINTS_PER_SUBOBJECT 300
// Subobject flags
#define SOF_ROTATE 0x01 // This subobject is a rotator
#define SOF_TURRET 0x02 // This subobject is a turret that tracks
#define SOF_SHELL 0x04 // This subobject is a door housing
#define SOF_FRONTFACE 0x08 // This subobject contains the front face for the door
#define SOF_MONITOR1 0x010 // This subobject contains it's first monitor
#define SOF_MONITOR2 0x020 // This subobject contains it's second monitor
#define SOF_MONITOR3 0x040 // This subobject contains it's third monitor
#define SOF_MONITOR4 0x080 // This subobject contains it's fourth monitor
#define SOF_MONITOR5 0x0100
#define SOF_MONITOR6 0x0200
#define SOF_MONITOR7 0x0400
#define SOF_MONITOR8 0x0800
#define SOF_FACING 0x01000 // This subobject always faces you
#define SOF_VIEWER 0x02000 // This subobject is marked as a 'viewer'.
#define SOF_LAYER 0x04000 // This subobject is marked as part of possible secondary model rendering.
#define SOF_WB 0x08000 // This subobject is part of a weapon battery
#define SOF_GLOW 0x0200000 // This subobject glows
#define SOF_CUSTOM 0x0400000 // This subobject has textures/colors that are customizable
#define SOF_THRUSTER 0x0800000 // This is a thruster subobject
#define SOF_JITTER 0x01000000 // This object jitters by itself
#define SOF_HEADLIGHT 0x02000000 // This suboject is a headlight
// gun bank
struct w_bank {
int parent;
vector pnt;
vector norm;
};
// attach bank
struct a_bank {
int parent;
vector pnt;
vector norm;
vector uvec;
bool f_uvec;
};
struct lightmap_object_face {
uint8_t num_verts;
uint16_t lmi_handle;
vector rvec, uvec;
float *u2, *v2;
};
struct lightmap_object {
uint8_t num_models;
int16_t num_faces[MAX_SUBOBJECTS];
lightmap_object_face *lightmap_faces[MAX_SUBOBJECTS];
uint8_t used;
};
struct polyface {
int8_t nverts;
int16_t *vertnums;
float *u;
float *v;
// float *u2,*v2; // For lightmaps only
ddgr_color color;
int16_t texnum;
vector normal;
};
// glow info
struct glowinfo {
float glow_r, glow_g, glow_b, glow_size, glow_length;
vector center, normal;
};
// bsp information
struct bsp_info {
char name[PAGENAME_LEN]; // name of the subsystem. Probably displayed on HUD
int movement_type; //-1 if no movement, otherwise rotational or positional movement -- subobjects only
int movement_axis; // which axis this subobject moves or rotates on.
int tree_offset; // offset of tree data (children included) into the model_data
int data_offset; // offset of data into the model_data
vector offset; // 3d offset from parent object
vector norm; // norm for sep plane
float d; // norm d for sep plane
vector pnt; // point for sep plane
vector geometric_center; // geometric center of this subobject. In the same Frame Of
// Reference as all other vertices in this submodel. (Relative to pivot point)
float rad; // radius for each submodel
vector *verts; // vertices for the submodel (NEWSTYLE)
vector *vertnorms;
float *alpha;
polyface *faces; // faces for the submodel (NEWSTYLE)
vector *face_min;
vector *face_max;
int16_t *vertnum_memory;
float *u_memory;
float *v_memory;
int nverts;
int num_faces; // amount of faces (NEWSTYLE);
int8_t children[MAX_SUBOBJECTS]; // children of this submodel
int parent; // what is parent for each submodel
uint8_t num_children;
vector min;
vector max;
int blown_off; // If set, this subobject is blown off. Stuffed by model_set_instance
angvec angs;
matrix mod_matrix; // The angles from parent. Stuffed by model_set_instance
vector mod_pos; // The modified position of this object. Used for positional interpolation
vector *keyframe_axis; // the axis of rotation for each keyframe
int *keyframe_angles; // The destination angles for each key frame
vector *keyframe_pos;
matrix *keyframe_matrix; // the combined rotation matrices up to frame n
uint16_t *tick_pos_remap; // For looking up keyframes fast
uint16_t *tick_ang_remap; // For looking up keyframes fast
int *rot_start_time;
int *pos_start_time;
int num_key_angles;
int num_key_pos;
int flags; // see SOF_FLAGS above
int rot_track_min, rot_track_max;
int pos_track_min, pos_track_max;
float rps; // if SOF_ROTATE or SOF_TURRET is set, this is the rotations per second
float fov; // Half the normalized angle that this turret is allowed to turn (amount in each direction)
float think_interval; // How quickly a turret updates which way it should move
float normalized_angle;
glowinfo *glow_info;
};
#define PMF_LIGHTMAP_RES 1
#define PMF_TIMED 2 // Uses new timed animation
#define PMF_ALPHA 4 // Has alpha per vertex qualities
#define PMF_FACING 8 // Has a submodel that is always facing
#define PMF_NOT_RESIDENT 16 // This polymodel is not in memory
#define PMF_SIZE_COMPUTED 32 // This polymodel's size is computed
// used to describe a polygon model
struct poly_model {
uint16_t used;
int flags; // PMF_flags, see above
uint8_t new_style; // if 1, then this polymodel is in the new outrage format (oof)
int id; // what the polygon model number is. (Index in Poly_models)
int version;
char name[PAGENAME_LEN];
int n_models;
int model_data_size;
uint8_t *model_data;
vector mins, maxs; // min,max for whole model
vector view_pos; // viewing position. Default to {0,0,0}.
float wall_size;
vector wall_size_offset;
float anim_size;
vector anim_size_offset;
float rad;
int n_textures;
int16_t textures[MAX_MODEL_TEXTURES]; // a list of bitmap indices
bsp_info *submodel; // an array of size n_models of submodel info.
int num_key_angles;
int num_key_pos;
int max_keys; // the greater number of num_key_pos or num_key_angles
int frame_min, frame_max; // For TIMED polymodels, the min/max frames
int n_guns;
w_bank *gun_slots; // array of gun banks
int n_ground;
w_bank *ground_slots; // array of ground planes
int n_attach;
a_bank *attach_slots;
int num_wbs;
poly_wb_info *poly_wb; // array of weapon batteries
int *render_order; // internal use
};
// Which kind of lighting model for this polymodel
enum polymodel_light_type {
POLYMODEL_LIGHTING_STATIC,
POLYMODEL_LIGHTING_GOURAUD,
POLYMODEL_LIGHTING_LIGHTMAP,
};
// polymodel effects stuff
// Effect flags:
#define PEF_ALPHA 1
#define PEF_DEFORM 2
#define PEF_COLOR 4
#define PEF_MED_RES 8
#define PEF_LO_RES 16
#define PEF_FOG 32
#define PEF_CUSTOM_COLOR 64
#define PEF_CUSTOM_TEXTURE 128
#define PEF_FOGGED_MODEL 256
#define PEF_SPECULAR_MODEL 512
#define PEF_SPECULAR_FACES 1024
#define PEF_GLOW_SCALAR 2048
#define PEF_THRUSTER_SCALAR 4096
#define PEF_DRAW_HEADLIGHTS 8192
#define PEF_NO_GLOWS (8192 << 1)
#define PEF_CUSTOM_GLOW (8192 << 2)
#define PEF_BUMPMAPPED (8192 << 3)
struct polymodel_effect {
int type;
float alpha;
float deform_range;
float r, g, b;
float fog_r, fog_g, fog_b;
int custom_texture;
int custom_color;
float spec_r, spec_g, spec_b;
vector spec_light_pos;
float spec_scalar;
vector bump_light_pos;
float bump_scalar;
float fog_depth;
float fog_eye_distance;
float fog_distance;
vector fog_plane, fog_portal_vert;
int fog_plane_check;
float glow_length_scalar;
float glow_size_scalar;
float glow_r, glow_g, glow_b;
};
#endif