mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 11:28:56 +00:00
426 lines
13 KiB
C++
426 lines
13 KiB
C++
/*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
|
|
--- HISTORICAL COMMENTS FOLLOW ---
|
|
|
|
* $Logfile: /DescentIII/Main/lib/polymodel.h $
|
|
* $Revision: 83 $
|
|
* $Date: 7/08/99 5:47p $
|
|
* $Author: Jason $
|
|
*
|
|
* Header for polygon model loading funcs
|
|
*
|
|
* $Log: /DescentIII/Main/lib/polymodel.h $
|
|
*
|
|
* 83 7/08/99 5:47p Jason
|
|
* changes for new bumpmapping system in 1.1 update patch
|
|
*
|
|
* 82 6/08/99 1:00p Jason
|
|
* changes for bumpmapping
|
|
*
|
|
* 81 4/09/99 12:06p Jason
|
|
* made model setup code faster
|
|
*
|
|
* 80 1/21/99 11:16p Jeff
|
|
* pulled out some structs and defines from header files and moved them
|
|
* into separate 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
|
|
*
|
|
* 79 1/20/99 5:36p Jason
|
|
* added custom glows for teams
|
|
*
|
|
* 78 1/13/99 12:43p Jason
|
|
* added some more detail settings
|
|
*
|
|
* 77 1/07/99 5:01p Keneta
|
|
* added more polymodel slots
|
|
*
|
|
* 76 11/30/98 3:59p Jason
|
|
* changed dynamic lighting to be better
|
|
*
|
|
* 75 10/12/98 9:30a Jason
|
|
* new polymodel memory scheme
|
|
*
|
|
* 74 10/07/98 5:07p Jason
|
|
* added new polymodel effect type
|
|
*
|
|
* 73 10/07/98 3:40p Chris
|
|
* Added $thruster
|
|
*
|
|
* 72 9/09/98 7:09p Jason
|
|
* changed afterburner effect for ships
|
|
*
|
|
* 71 8/31/98 1:35p Keneta
|
|
* Made some use count unsigned shorts
|
|
*
|
|
* 70 8/24/98 1:01p Jason
|
|
* made object specular faces selectable by texture
|
|
*
|
|
* 69 8/21/98 5:14p Jason
|
|
* made better memory use of primitives
|
|
*
|
|
* 68 8/18/98 11:38a Jason
|
|
* fixed polymodel fog lighting
|
|
*
|
|
* 67 8/18/98 11:26a Matt
|
|
* Changed outline code to only outline polymodel objects when they're
|
|
* being rendered in the mine, and not when they're being drawn in the
|
|
* editor, main menu, cockpit, etc.
|
|
*
|
|
* 66 8/14/98 4:00p Jason
|
|
* added specular objects outside
|
|
*
|
|
* 65 8/13/98 6:56p Jason
|
|
* made objects foggable correctly
|
|
*
|
|
* 64 8/12/98 12:04p Chris
|
|
* Attach system version .5 (still needs more work to be multiplayer
|
|
* friendly)
|
|
*
|
|
* 63 8/04/98 2:32p Chris
|
|
* Improved attach code added more fixes to the AABB partial computation
|
|
* patch
|
|
*
|
|
* 62 7/29/98 5:05p Chris
|
|
* Made more of the wb info dynamically allocated. Added Attach points to
|
|
* the polymodel structure
|
|
*
|
|
* 61 7/27/98 10:39a Jason
|
|
* added customizable skins
|
|
*
|
|
* 60 6/22/98 7:31p Samir
|
|
* added mask for monitors.
|
|
*
|
|
* 59 6/15/98 4:00p Jason
|
|
* replaced monochromatic polymodel lighting with rgb lighting
|
|
*
|
|
* 58 5/13/98 12:06p Jason
|
|
* trimmed some memory usage
|
|
*
|
|
* 57 4/30/98 12:22p Jason
|
|
* did some lo-res model optimizations
|
|
*
|
|
* 56 4/30/98 11:32a Chris
|
|
* ClearWB to WBClear
|
|
*
|
|
* 55 4/17/98 12:45p Jason
|
|
* various changes for multiplayer
|
|
*
|
|
* 54 4/15/98 3:28p Jason
|
|
* changed glow stuff to work with new system
|
|
*
|
|
* 53 4/07/98 6:22p Samir
|
|
* restored a couple of variables to the poly_model array that were used
|
|
* elsewhere in the code. left out the nasty one though.
|
|
*
|
|
* 52 4/07/98 5:59p Jason
|
|
* saved about 15 megs of storage by deleting an unused array
|
|
*
|
|
* 51 4/06/98 3:03p Jason
|
|
* added polygon rendering overlays
|
|
*
|
|
* 50 4/03/98 1:13p Jason
|
|
* shaved off a few more bytes from the polyface structure
|
|
*
|
|
* 49 4/03/98 10:07a Chris
|
|
* Added support for objects getting their size computed when the
|
|
* polymodel is paged in the first time as an object
|
|
*
|
|
* 48 4/02/98 3:54p Jason
|
|
* first pass in getting polymodel paging to work
|
|
*
|
|
* 47 4/02/98 12:22p Jason
|
|
* changes for deformation effect
|
|
*
|
|
* 46 4/01/98 6:23p Jason
|
|
* added a slew of stuff for multiplayer
|
|
*
|
|
* 45 3/31/98 11:12a Brent
|
|
* upped number of textures for the undisciplined bastard know as BRENT
|
|
*
|
|
* 44 3/29/98 11:58p Jason
|
|
* saved some memory with object lightmaps
|
|
*
|
|
* 43 3/26/98 2:14p Jason
|
|
* added dynamic lighting for objects
|
|
*
|
|
* 42 3/24/98 5:16p Jason
|
|
* upped polyvecs for that fucker brent
|
|
*
|
|
* 41 3/23/98 10:03a Chris
|
|
* Added independent wb animations
|
|
*
|
|
* 40 3/19/98 4:30p Samir
|
|
* added ability to mark subobjects as layered.
|
|
*
|
|
* 39 3/18/98 6:24p Samir
|
|
* Fixed some bugs with normalizing MONITORs and added VIEWER flag.
|
|
*
|
|
* 38 3/16/98 3:47p Jason
|
|
* got rid of circular dependencies for objects and polymodels
|
|
*
|
|
* 37 3/16/98 3:24p Chris
|
|
* Removed my the object.h dependancy
|
|
*
|
|
* 36 3/16/98 11:34a Chris
|
|
* Polymodels have 3 levels of AABB (object, subobject, and face level)
|
|
*
|
|
* 35 3/13/98 5:55p Chris
|
|
* Added the new collision spheres
|
|
*
|
|
* 34 3/11/98 4:59p Chris
|
|
* Added a few new sphere types (wall and anim)
|
|
*
|
|
* 33 3/10/98 6:54p Chris
|
|
* All start and end frame for ComputeDefaultSize
|
|
*
|
|
* 32 2/17/98 12:19p Jason
|
|
* upped max polymodel count to 500
|
|
*
|
|
* 31 2/16/98 2:49p Chris
|
|
* Made the MAX_SUBOBJECTS determine the number of normalized_time values
|
|
* to be processed. No longer a 'literal' problem.
|
|
*
|
|
* 30 2/16/98 2:12p Jason
|
|
* fixed bug with lightmaps and door shells
|
|
*
|
|
* 29 2/13/98 12:44p Jason
|
|
* upped max number of subobjects
|
|
*
|
|
* 28 2/04/98 9:28p Jason
|
|
* added some new weapons effects
|
|
*
|
|
* 27 1/13/98 3:09p Jason
|
|
* added glow effect for engines
|
|
*
|
|
* 26 12/31/97 3:34p Jason
|
|
* added alpha per vertex for polymodels
|
|
*
|
|
* 25 11/17/97 6:28p Mark
|
|
* FROM Jason:fixed memory leak
|
|
*
|
|
* 24 11/06/97 4:18p Samir
|
|
* texture numbers are now shorts in polymodel
|
|
*
|
|
* 23 11/04/97 4:58p Samir
|
|
* Added 4 more monitors.
|
|
*
|
|
* 22 10/28/97 6:37p Samir
|
|
* Submodels now can be monitors.
|
|
*
|
|
* 21 10/23/97 2:07p Jason
|
|
* fixed some problems with debris not spinning about their center point
|
|
*
|
|
* 20 10/01/97 7:00p Jason
|
|
* did more work on object lightmaps
|
|
*
|
|
* 19 9/30/97 6:40p Jason
|
|
* got lightmap stuff sort of working with objects
|
|
*
|
|
* 18 9/26/97 12:09p Jason
|
|
* made positional/rotational animations have differing
|
|
* track_min/track_max
|
|
*
|
|
* 17 9/25/97 4:54p Jason
|
|
* added timer info to polymodels
|
|
*
|
|
* 16 9/17/97 10:59a Chris
|
|
* Added a new way to compute radi
|
|
*
|
|
* 15 9/11/97 5:38p Jason
|
|
* initial door coding for room engine
|
|
*
|
|
* 14 9/10/97 5:36p Jason
|
|
* changed version number for new oofs
|
|
*
|
|
* 13 9/10/97 5:17p Jason
|
|
* more lighting improvements
|
|
*
|
|
* 12 9/09/97 6:15p Jason
|
|
* made dynamic lighting on objects more memory efficient
|
|
*
|
|
* 11 9/04/97 3:49p Chris
|
|
* Added additional turret information from pofgen, added ground plane
|
|
* stuff
|
|
*
|
|
* 10 9/03/97 4:11p Chris
|
|
* Moved some code so that pofview will compile
|
|
*
|
|
* 9 9/03/97 2:12p Chris
|
|
* Added new weapon battery system and made the animation system usable.
|
|
*
|
|
* 8 8/25/97 6:19p Chris
|
|
* Added support for knowing which subobject a gun point is linked to
|
|
*
|
|
* 7 8/20/97 3:16p Chris
|
|
* Added some hooks for turrets
|
|
*
|
|
* 6 8/03/97 2:25p Jason
|
|
* made polymodels use less memory
|
|
*
|
|
* 5 7/28/97 1:16p Chris
|
|
*
|
|
* 4 7/23/97 11:48a Jason
|
|
* added support for newstyle pof format
|
|
*
|
|
* 3 7/22/97 1:34a Jason
|
|
* added code to support newstyle polymodels
|
|
*
|
|
* 18 6/24/97 6:13p Matt
|
|
* Got rid of DrawPolygonObject(), since it required the inclusion of
|
|
* object.h, which is a main directory header file (& thus shouldn't be
|
|
* accessible by a library).
|
|
*
|
|
* $NoKeywords: $
|
|
*/
|
|
|
|
#ifndef POLYMODEL_H
|
|
#define POLYMODEL_H
|
|
|
|
#include <cstdint>
|
|
#include <filesystem>
|
|
|
|
#include "3d.h"
|
|
#include "object_external_struct.h"
|
|
#include "polymodel_external.h"
|
|
#include "vecmat.h"
|
|
|
|
#define PM_COMPATIBLE_VERSION 1807
|
|
#define PM_OBJFILE_VERSION 2300
|
|
|
|
#define WB_INDEX_SHIFT 16 // bits to shift over to get the weapon battery index (after masking out flags)
|
|
#define SOF_WB_MASKS 0x01F0000 // Room for 32 weapon batteries (currently we only use 21 slots)
|
|
|
|
#define SOF_MONITOR_MASK 0x0ff0 // mask for monitors
|
|
|
|
extern int Num_poly_models;
|
|
extern poly_model Poly_models[];
|
|
|
|
extern int Polymodel_use_effect;
|
|
extern polymodel_effect Polymodel_effect;
|
|
extern polymodel_light_type Polymodel_light_type;
|
|
extern float Polylighting_static_red;
|
|
extern float Polylighting_static_green;
|
|
extern float Polylighting_static_blue;
|
|
extern vector *Polymodel_light_direction, Polymodel_fog_portal_vert, Polymodel_fog_plane, Polymodel_specular_pos,
|
|
Polymodel_bump_pos;
|
|
extern lightmap_object *Polylighting_lightmap_object;
|
|
|
|
extern vector Interp_pos_instance_vec;
|
|
extern g3Point Robot_points[];
|
|
|
|
// Flag to draw an outline around the faces
|
|
extern bool Polymodel_outline_mode;
|
|
|
|
// given a filename, reads in a POF and returns an index into the Poly_models array
|
|
// returns -1 if something is wrong
|
|
int LoadPolyModel(const std::filesystem::path &filename, int pageable);
|
|
|
|
// gets the filename from a path, plus appends our .pof extension
|
|
std::filesystem::path ChangePolyModelName(const std::filesystem::path &src);
|
|
|
|
// Searches through all polymodels for a specific name, returns -1 if not found
|
|
// or index of polymodel with name
|
|
int FindPolyModelName(const std::filesystem::path &name);
|
|
|
|
// Draws a polygon model to the viewport
|
|
// Normalized_time is an array of floats from 0 to 1 that represent how far into
|
|
// an animation state we are
|
|
|
|
// This one is for static lighting - ie 1 light value for the entire model
|
|
void DrawPolygonModel(vector *pos, matrix *orient, int model_num, float *normalized_time, int flags, float r, float g,
|
|
float b, uint32_t f_render_sub = 0xFFFFFFFF, uint8_t use_effect = 0, uint8_t overlay = 0);
|
|
|
|
// This one is for gouraud shading - the lightdir is the normalized light direction, and lightscalar is a 0-1 scalar to
|
|
// apply
|
|
void DrawPolygonModel(vector *pos, matrix *orient, int model_num, float *normalized_time, int flags, vector *lightdir,
|
|
float r, float g, float b, uint32_t f_render_sub = 0xFFFFFFFF, uint8_t use_effect = 0,
|
|
uint8_t overlay = 0);
|
|
|
|
// This one is for lightmap rendering
|
|
void DrawPolygonModel(vector *pos, matrix *orient, int model_num, float *normalized_time, int flags,
|
|
lightmap_object *lm_object, uint32_t f_render_sub, uint8_t use_effect = 0, uint8_t overlay = 0);
|
|
|
|
// Inits our models array
|
|
int InitModels();
|
|
|
|
// Frees polymodel located in index of Poly_models array
|
|
void FreePolyModel(int index);
|
|
|
|
// Given an actual keyframe number, returns the normalized (0 to 1) position of that
|
|
// keyframe. Handle is an index into the Poly_models array
|
|
float GetNormalizedKeyframe(int handle, float num);
|
|
|
|
// Goes through all poly models and gets all missing textures
|
|
void RemapPolyModels();
|
|
|
|
// Sets a positional instance
|
|
void StartPolyModelPosInstance(vector *posvec);
|
|
|
|
// Pops a positional instance
|
|
void DonePolyModelPosInstance();
|
|
|
|
void SetModelAngles(poly_model *po, const float *normalized_angles);
|
|
void SetModelInterpPos(poly_model *po, const float *normalized_pos);
|
|
|
|
void SetNormalizedTimeObj(object *obj, float *normalized_time);
|
|
void SetNormalizedTimeAnim(float norm_anim_frame, float *normalized_time, poly_model *pm);
|
|
|
|
void WBClearInfo(poly_model *pm);
|
|
|
|
// Computes the size of a polymodel.
|
|
float ComputeDefaultSize(int type, int handle, float *size_ptr);
|
|
|
|
// Returns the total number of faces in a model
|
|
int CountFacesInPolymodel(poly_model *pm);
|
|
|
|
// Rendering functions
|
|
int RenderPolygonModel(poly_model *, uint32_t f_render_sub = 0xFFFFFFFF);
|
|
void RenderSubmodel(poly_model *pm, bsp_info *sm, uint32_t f_render_sub);
|
|
|
|
// returns point within polymodel/submodel in world coordinates.
|
|
void GetPolyModelPointInWorld(vector *dest, poly_model *pm, vector *wpos, matrix *orient, int subnum, vector *pos,
|
|
vector *norm = nullptr);
|
|
void GetPolyModelPointInWorld(vector *dest, poly_model *pm, vector *wpos, matrix *orient, int subnum,
|
|
float *normalized_time, vector *pos, vector *norm = nullptr);
|
|
|
|
// Returns 1 if this submodel shouldn't be rendered
|
|
int IsNonRenderableSubmodel(poly_model *pm, int submodelnum);
|
|
|
|
// Sets the effect used by a polymodel
|
|
void SetPolymodelEffect(polymodel_effect *);
|
|
|
|
// Pages in a polymodel if it is not already in memory
|
|
void PageInPolymodel(int polynum, int type = -1, float *size_ptr = nullptr);
|
|
|
|
// Gets a pointer to a polymodel. Pages it in if neccessary
|
|
poly_model *GetPolymodelPointer(int polynum);
|
|
|
|
// Frees all the polymodel data, but doesn't free the actual polymodel itself
|
|
void FreePolymodelData(int i);
|
|
|
|
// Sets the position and rotation of a polymodel. Used for rendering and collision detection
|
|
void SetModelAnglesAndPos(poly_model *po, float *normalized_time, uint32_t subobj_flags = 0xFFFFFFFF);
|
|
|
|
extern void DoneLightInstance();
|
|
extern void StartLightInstance(vector *, matrix *);
|
|
|
|
#endif
|