Files
ImHex-Patterns/patterns/3ds.hexpat
Mrmaxmeier c533017d0b git: Various style fixes everywhere, removing whitespaces (#321)
* repo-wide: trim trailing spaces

Note: This doesn't touch the .tbl files in encodings/ since they include
meaningful trailing spaces (`20= `)

* patterns: clean up duplicate semicolons

* ELF: add header magic check

* glTF: use type::Magic for magic value

* glTF: check that the file size in the header matches

* xgstexture: fix generics syntax for magic value

* JPEG: define hex enum with 0x00 instead of 0X00

* CI: update deprecated actions

---------

Co-authored-by: Nik <werwolv98@gmail.com>
2024-11-24 11:41:26 +01:00

1141 lines
43 KiB
Rust

#pragma author WerWolv
#pragma description Autodesk 3DS Max Model
import std.io;
import type.base;
#pragma MIME image/x-3ds
// Heavily based off of ZiZi's 010 Editor 3DS Template
enum ChunkIdentifier : u16 {
NULL_CHUNK = 0x0000,
ChunkType = 0x0995,
ChunkUnique = 0x0996,
NotChunk = 0x0997,
Container = 0x0998,
IsChunk = 0x0999,
/* Dummy Chunk that sometimes appears in 3ds files created by prerelease 3D Studio R2 */
DUMMY = 0xFFFF,
/* Chunk Types for Open*, Write*, Close* functions */
POINT_ARRAY_ENTRY = 0xF110,
POINT_FLAG_ARRAY_ENTRY = 0xF111,
FACE_ARRAY_ENTRY = 0xF120,
MSH_MAT_GROUP_ENTRY = 0xF130,
TEX_VERTS_ENTRY = 0xF140,
SMOOTH_GROUP_ENTRY = 0xF150,
POS_TRACK_TAG_KEY = 0xF020,
ROT_TRACK_TAG_KEY = 0xF021,
SCL_TRACK_TAG_KEY = 0xF022,
FOV_TRACK_TAG_KEY = 0xF023,
ROLL_TRACK_TAG_KEY = 0xF024,
COL_TRACK_TAG_KEY = 0xF025,
MORPH_TRACK_TAG_KEY = 0xF026,
HOT_TRACK_TAG_KEY = 0xF027,
FALL_TRACK_TAG_KEY = 0xF028,
/* 3DS File Chunk IDs */
COLOR_F = 0x0010, // r,g,b: Single precision float
COLOR_24 = 0x0011, // r,g,b: Byte
LIN_COLOR_24 = 0x0012, // r,g,b: Byte (gamma corrected)
LIN_COLOR_F = 0x0013, // r,g,b: Single precision float (gamma corrected)
INT_PERCENTAGE = 0x0030, // u16 integer
FLOAT_PERCENTAGE = 0x0031, // Single precision float
M3DMAGIC = 0x4D4D,
SMAGIC = 0x2D2D,
LMAGIC = 0x2D3D,
MLIBMAGIC = 0x3DAA,
MATMAGIC = 0x3DFF,
M3D_VERSION = 0x0002,
MDATA = 0x3D3D,
MESH_VERSION = 0x3D3E,
WORLD_VIEWPORT_DATA = 0x7011,
WORLD_VIEWPORT_DATA3 = 0x7012,
WORLD_VIEWPORT_SIZE = 0x7020,
WORLD_VIEWPORT_LAYOUT = 0x7001,
MASTER_SCALE = 0x0100,
BIT_MAP = 0x1100, // Background bitmap filename
USE_BIT_MAP = 0x1101, // Use background bitmap
SOLID_BGND = 0x1200, // Background color
USE_SOLID_BGND = 0x1201, // Use background color
V_GRADIENT = 0x1300, // Background gradient colors
USE_V_GRADIENT = 0x1301, // Use background gradient colors
LO_SHADOW_BIAS = 0x1400,
HI_SHADOW_BIAS = 0x1410,
SHADOW_MAP_SIZE = 0x1420,
SHADOW_SAMPLES = 0x1430,
SHADOW_RANGE = 0x1440,
SHADOW_FILTER = 0x1450,
RAY_BIAS = 0x1460,
USE_RAYTRACE = 0x1470,
O_CONSTS = 0x1500,
AMBIENT_LIGHT = 0x2100,
FOG = 0x2200,
USE_FOG = 0x2201,
FOG_BGND = 0x2210,
DISTANCE_CUE = 0x2300,
USE_DISTANCE_CUE = 0x2301,
WORLD_LAYERED_FOG = 0x2302,
WORLD_USE_LAYERED_FOG = 0x2303,
DEFAULT_VIEW = 0x3000,
VIEW_TOP = 0x3010,
VIEW_BOTTOM = 0x3020,
VIEW_LEFT = 0x3030,
VIEW_RIGHT = 0x3040,
VIEW_FRONT = 0x3050,
VIEW_BACK = 0x3060,
VIEW_USER = 0x3070,
VIEW_CAMERA = 0x3080,
VIEW_WINDOW = 0x3090,
NAMED_OBJECT = 0x4000,
OBJ_HIDDEN = 0x4010,
OBJ_VIS_LOFTER = 0x4011,
OBJ_DOESNT_CAST = 0x4012,
OBJ_MATTE = 0x4013,
OBJ_FAST = 0x4014,
OBJ_PROCEDURAL = 0x4015,
OBJ_FROZEN = 0x4016,
OBJ_DONT_RCVSHADOW = 0x4017,
N_TRI_OBJECT = 0x4100,
POINT_ARRAY = 0x4110,
POINT_FLAG_ARRAY = 0x4111,
FACE_ARRAY = 0x4120,
MSH_MAT_GROUP = 0x4130,
OLD_MAT_GROUP = 0x4131,
SMOOTH_GROUP = 0x4150,
TEX_VERTS = 0x4140,
MESH_MATRIX = 0x4160,
MESH_COLOR = 0x4165,
MESH_TEXTURE_INFO = 0x4170,
PROC_NAME = 0x4181,
PROC_DATA = 0x4182,
MSH_BOXMAP = 0x4190,
N_D_L_OLD = 0x4400,
N_CAM_OLD = 0x4500,
N_DIRECT_LIGHT = 0x4600,
DL_SPOTLIGHT = 0x4610,
DL_RAYSHAD = 0x4627,
DL_SHADOWED = 0x4630,
DL_LOCAL_SHADOW = 0x4640,
DL_LOCAL_SHADOW2 = 0x4641,
DL_SEE_CONE = 0x4650,
DL_SPOT_RECTANGULAR = 0x4651,
DL_SPOT_OVERSHOOT = 0x4652,
DL_SPOT_PROJECTOR = 0x4653,
DL_EXCLUDE = 0x4654,
DL_RANGE = 0x4655, /* Not used in R3 */
DL_SPOT_ROLL = 0x4656,
DL_SPOT_ASPECT = 0x4657,
DL_RAY_BIAS = 0x4658,
DL_OFF = 0x4620,
DL_ATTENUATE = 0x4625,
DL_INNER_RANGE = 0x4659,
DL_OUTER_RANGE = 0x465A,
DL_MULTIPLIER = 0x465B,
N_AMBIENT_LIGHT = 0x4680,
N_CAMERA = 0x4700,
CAM_SEE_CONE = 0x4710,
CAM_RANGES = 0x4720,
HIERARCHY = 0x4F00,
PARENT_OBJECT = 0x4F10,
PIVOT_OBJECT = 0x4F20,
PIVOT_LIMITS = 0x4F30,
PIVOT_ORDER = 0x4F40,
XLATE_RANGE = 0x4F50,
POLY_2D = 0x5000,
/* Flags in shaper file that tell whether polys make up an ok shape */
SHAPE_OK = 0x5010,
SHAPE_NOT_OK = 0x5011,
SHAPE_HOOK = 0x5020,
PATH_3D = 0x6000,
PATH_MATRIX = 0x6005,
SHAPE_2D = 0x6010,
M_SCALE = 0x6020,
M_TWIST = 0x6030,
M_TEETER = 0x6040,
M_FIT = 0x6050,
M_BEVEL = 0x6060,
XZ_CURVE = 0x6070,
YZ_CURVE = 0x6080,
INTERPCT = 0x6090,
DEFORM_LIMIT = 0x60A0,
/* Flags for Modeler options */
USE_CONTOUR = 0x6100,
USE_TWEEN = 0x6110,
USE_SCALE = 0x6120,
USE_TWIST = 0x6130,
USE_TEETER = 0x6140,
USE_FIT = 0x6150,
USE_BEVEL = 0x6160,
/* Viewport description chunks */
VIEWPORT_LAYOUT_OLD = 0x7000,
VIEWPORT_DATA_OLD = 0x7010,
VIEWPORT_LAYOUT = 0x7001,
VIEWPORT_DATA = 0x7011,
VIEWPORT_DATA_3 = 0x7012,
VIEWPORT_SIZE = 0x7020,
NETWORK_VIEW = 0x7030,
/* External Application Data */
XDATA_SECTION = 0x8000,
XDATA_ENTRY = 0x8001,
XDATA_APPNAME = 0x8002,
XDATA_STRING = 0x8003,
XDATA_FLOAT = 0x8004,
XDATA_DOUBLE = 0x8005,
XDATA_SHORT = 0x8006,
XDATA_LONG = 0x8007,
XDATA_VOID = 0x8008,
XDATA_GROUP = 0x8009,
XDATA_RFU6 = 0x800A,
XDATA_RFU5 = 0x800B,
XDATA_RFU4 = 0x800C,
XDATA_RFU3 = 0x800D,
XDATA_RFU2 = 0x800E,
XDATA_RFU1 = 0x800F,
PARENT_NAME = 0x80F0,
/* Material Chunk IDs */
MAT_ENTRY = 0xAFFF,
MAT_NAME = 0xA000,
MAT_AMBIENT = 0xA010,
MAT_DIFFUSE = 0xA020,
MAT_SPECULAR = 0xA030,
MAT_SHININESS = 0xA040,
MAT_SHIN2PCT = 0xA041,
MAT_SHIN3PCT = 0xA042,
MAT_TRANSPARENCY = 0xA050,
MAT_XPFALL = 0xA052,
MAT_REFBLUR = 0xA053,
MAT_SELF_ILLUM = 0xA080,
MAT_TWO_SIDE = 0xA081,
MAT_DECAL = 0xA082,
MAT_ADDITIVE = 0xA083,
MAT_SELF_ILPCT = 0xA084,
MAT_WIRE = 0xA085,
MAT_SUPERSMP = 0xA086,
MAT_WIRESIZE = 0xA087,
MAT_FACEMAP = 0xA088,
MAT_XPFALLIN = 0xA08A,
MAT_PHONGSOFT = 0xA08C,
MAT_WIREABS = 0xA08E,
MAT_SHADING = 0xA100,
MAT_TEXMAP = 0xA200,
MAT_MAPNAME = 0xA300,
MAT_ACUBIC = 0xA310,
MAT_MAP_TILINGOLD = 0xA350,
MAT_MAP_TILING = 0xA351,
MAT_MAP_TEXBLUR_OLD = 0xA352,
MAT_MAP_TEXBLUR = 0xA353,
MAT_MAP_USCALE = 0xA354,
MAT_MAP_VSCALE = 0xA356,
MAT_MAP_UOFFSET = 0xA358,
MAT_MAP_VOFFSET = 0xA35A,
MAT_MAP_ANG = 0xA35C,
MAT_MAP_COL1 = 0xA360,
MAT_MAP_COL2 = 0xA362,
MAT_MAP_RCOL = 0xA364,
MAT_MAP_GCOL = 0xA366,
MAT_MAP_BCOL = 0xA368,
MAT_SPECMAP = 0xA204,
MAT_OPACMAP = 0xA210,
MAT_REFLMAP = 0xA220,
MAT_BUMPMAP = 0xA230,
MAT_USE_REFBLUR = 0xA250,
MAT_BUMP_PERCENT = 0xA252,
MAT_SXP_TEXT_DATA = 0xA320,
MAT_SXP_TEXT2_DATA = 0xA321,
MAT_SXP_OPAC_DATA = 0xA322,
MAT_SXP_BUMP_DATA = 0xA324,
MAT_SXP_SPEC_DATA = 0xA325,
MAT_SXP_SHIN_DATA = 0xA326,
MAT_SXP_SELFI_DATA = 0xA328,
MAT_SXP_TEXT_MASKDATA = 0xA32A,
MAT_SXP_TEXT2_MASKDATA = 0xA32C,
MAT_SXP_OPAC_MASKDATA = 0xA32E,
MAT_SXP_BUMP_MASKDATA = 0xA330,
MAT_SXP_SPEC_MASKDATA = 0xA332,
MAT_SXP_SHIN_MASKDATA = 0xA334,
MAT_SXP_SELFI_MASKDATA = 0xA336,
MAT_SXP_REFL_MASKDATA = 0xA338,
MAT_TEX2MAP = 0xA33A,
MAT_SHINMAP = 0xA33C,
MAT_SELFIMAP = 0xA33D,
MAT_TEXMASK = 0xA33E,
MAT_TEX2MASK = 0xA340,
MAT_OPACMASK = 0xA342,
MAT_BUMPMASK = 0xA344,
MAT_SHINMASK = 0xA346,
MAT_SPECMASK = 0xA348,
MAT_SELFIMASK = 0xA34A,
MAT_REFLMASK = 0xA34C,
/* Keyframe Chunk IDs */
KFDATA = 0xB000,
KFHDR = 0xB00A,
AMBIENT_NODE_TAG = 0xB001,
OBJECT_NODE_TAG = 0xB002,
CAMERA_NODE_TAG = 0xB003,
TARGET_NODE_TAG = 0xB004,
LIGHT_NODE_TAG = 0xB005,
L_TARGET_NODE_TAG = 0xB006,
SPOTLIGHT_NODE_TAG = 0xB007,
KFSEG = 0xB008,
KFCURTIME = 0xB009,
NODE_HDR = 0xB010,
INSTANCE_NAME = 0xB011,
PRESCALE = 0xB012,
PIVOT = 0xB013,
BOUNDBOX = 0xB014,
MORPH_SMOOTH = 0xB015,
POS_TRACK_TAG = 0xB020,
ROT_TRACK_TAG = 0xB021,
SCL_TRACK_TAG = 0xB022,
FOV_TRACK_TAG = 0xB023,
ROLL_TRACK_TAG = 0xB024,
COL_TRACK_TAG = 0xB025,
MORPH_TRACK_TAG = 0xB026,
HOT_TRACK_TAG = 0xB027,
FALL_TRACK_TAG = 0xB028,
HIDE_TRACK_TAG = 0xB029,
NODE_ID = 0xB030,
CMAGIC = 0xC23D,
C_MDRAWER = 0xC010,
C_TDRAWER = 0xC020,
C_SHPDRAWER = 0xC030,
C_MODDRAWER = 0xC040,
C_RIPDRAWER = 0xC050,
C_TXDRAWER = 0xC060,
C_PDRAWER = 0xC062,
C_MTLDRAWER = 0xC064,
C_FLIDRAWER = 0xC066,
C_CUBDRAWER = 0xC067,
C_MFILE = 0xC070,
C_SHPFILE = 0xC080,
C_MODFILE = 0xC090,
C_RIPFILE = 0xC0A0,
C_TXFILE = 0xC0B0,
C_PFILE = 0xC0B2,
C_MTLFILE = 0xC0B4,
C_FLIFILE = 0xC0B6,
C_PALFILE = 0xC0B8,
C_TX_STRING = 0xC0C0,
C_CONSTS = 0xC0D0,
C_SNAPS = 0xC0E0,
C_GRIDS = 0xC0F0,
C_ASNAPS = 0xC100,
C_GRID_RANGE = 0xC110,
C_RENDTYPE = 0xC120,
C_PROGMODE = 0xC130,
C_PREVMODE = 0xC140,
C_MODWMODE = 0xC150,
C_MODMODEL = 0xC160,
C_ALL_LINES = 0xC170,
C_BACK_TYPE = 0xC180,
C_MD_CS = 0xC190,
C_MD_CE = 0xC1A0,
C_MD_SML = 0xC1B0,
C_MD_SMW = 0xC1C0,
C_LOFT_WITH_TEXTURE = 0xC1C3,
C_LOFT_L_REPEAT = 0xC1C4,
C_LOFT_W_REPEAT = 0xC1C5,
C_LOFT_UV_NORMALIZE = 0xC1C6,
C_WELD_LOFT = 0xC1C7,
C_MD_PDET = 0xC1D0,
C_MD_SDET = 0xC1E0,
C_RGB_RMODE = 0xC1F0,
C_RGB_HIDE = 0xC200,
C_RGB_MAPSW = 0xC202,
C_RGB_TWOSIDE = 0xC204,
C_RGB_SHADOW = 0xC208,
C_RGB_AA = 0xC210,
C_RGB_OVW = 0xC220,
C_RGB_OVH = 0xC230,
C_RGB_PICTYPE = 0xC240,
C_RGB_OUTPUT = 0xC250,
C_RGB_TODISK = 0xC253,
C_RGB_COMPRESS = 0xC254,
C_JPEG_COMPRESSION = 0xC255,
C_RGB_DISPDEV = 0xC256,
C_RGB_HARDDEV = 0xC259,
C_RGB_PATH = 0xC25A,
C_BITMAP_DRAWER = 0xC25B,
C_RGB_FILE = 0xC260,
C_RGB_OVASPECT = 0xC270,
C_RGB_ANIMTYPE = 0xC271,
C_RENDER_ALL = 0xC272,
C_REND_FROM = 0xC273,
C_REND_TO = 0xC274,
C_REND_NTH = 0xC275,
C_PAL_TYPE = 0xC276,
C_RND_TURBO = 0xC277,
C_RND_MIP = 0xC278,
C_BGND_METHOD = 0xC279,
C_AUTO_REFLECT = 0xC27A,
C_VP_FROM = 0xC27B,
C_VP_TO = 0xC27C,
C_VP_NTH = 0xC27D,
C_REND_TSTEP = 0xC27E,
C_VP_TSTEP = 0xC27F,
C_SRDIAM = 0xC280,
C_SRDEG = 0xC290,
C_SRSEG = 0xC2A0,
C_SRDIR = 0xC2B0,
C_HETOP = 0xC2C0,
C_HEBOT = 0xC2D0,
C_HEHT = 0xC2E0,
C_HETURNS = 0xC2F0,
C_HEDEG = 0xC300,
C_HESEG = 0xC310,
C_HEDIR = 0xC320,
C_QUIKSTUFF = 0xC330,
C_SEE_LIGHTS = 0xC340,
C_SEE_CAMERAS = 0xC350,
C_SEE_3D = 0xC360,
C_MESHSEL = 0xC370,
C_MESHUNSEL = 0xC380,
C_POLYSEL = 0xC390,
C_POLYUNSEL = 0xC3A0,
C_SHPLOCAL = 0xC3A2,
C_MSHLOCAL = 0xC3A4,
C_NUM_FORMAT = 0xC3B0,
C_ARCH_DENOM = 0xC3C0,
C_IN_DEVICE = 0xC3D0,
C_MSCALE = 0xC3E0,
C_COMM_PORT = 0xC3F0,
C_TAB_BASES = 0xC400,
C_TAB_DIVS = 0xC410,
C_MASTER_SCALES = 0xC420,
C_SHOW_1STVERT = 0xC430,
C_SHAPER_OK = 0xC440,
C_LOFTER_OK = 0xC450,
C_EDITOR_OK = 0xC460,
C_KEYFRAMER_OK = 0xC470,
C_PICKSIZE = 0xC480,
C_MAPTYPE = 0xC490,
C_MAP_DISPLAY = 0xC4A0,
C_TILE_XY = 0xC4B0,
C_MAP_XYZ = 0xC4C0,
C_MAP_SCALE = 0xC4D0,
C_MAP_MATRIX_OLD = 0xC4E0,
C_MAP_MATRIX = 0xC4E1,
C_MAP_WID_HT = 0xC4F0,
C_OBNAME = 0xC500,
C_CAMNAME = 0xC510,
C_LTNAME = 0xC520,
C_CUR_MNAME = 0xC525,
C_CURMTL_FROM_MESH = 0xC526,
C_GET_SHAPE_MAKE_FACES = 0xC527,
C_DETAIL = 0xC530,
C_VERTMARK = 0xC540,
C_MSHAX = 0xC550,
C_MSHCP = 0xC560,
C_USERAX = 0xC570,
C_SHOOK = 0xC580,
C_RAX = 0xC590,
C_STAPE = 0xC5A0,
C_LTAPE = 0xC5B0,
C_ETAPE = 0xC5C0,
C_KTAPE = 0xC5C8,
C_SPHSEGS = 0xC5D0,
C_GEOSMOOTH = 0xC5E0,
C_HEMISEGS = 0xC5F0,
C_PRISMSEGS = 0xC600,
C_PRISMSIDES = 0xC610,
C_TUBESEGS = 0xC620,
C_TUBESIDES = 0xC630,
C_TORSEGS = 0xC640,
C_TORSIDES = 0xC650,
C_CONESIDES = 0xC660,
C_CONESEGS = 0xC661,
C_NGPARMS = 0xC670,
C_PTHLEVEL = 0xC680,
C_MSCSYM = 0xC690,
C_MFTSYM = 0xC6A0,
C_MTTSYM = 0xC6B0,
C_SMOOTHING = 0xC6C0,
C_MODICOUNT = 0xC6D0,
C_FONTSEL = 0xC6E0,
C_TESS_TYPE = 0xC6f0,
C_TESS_TENSION = 0xC6f1,
C_SEG_START = 0xC700,
C_SEG_END = 0xC705,
C_CURTIME = 0xC710,
C_ANIMLENGTH = 0xC715,
C_PV_FROM = 0xC720,
C_PV_TO = 0xC725,
C_PV_DOFNUM = 0xC730,
C_PV_RNG = 0xC735,
C_PV_NTH = 0xC740,
C_PV_TYPE = 0xC745,
C_PV_METHOD = 0xC750,
C_PV_FPS = 0xC755,
C_VTR_FRAMES = 0xC765,
C_VTR_HDTL = 0xC770,
C_VTR_HD = 0xC771,
C_VTR_TL = 0xC772,
C_VTR_IN = 0xC775,
C_VTR_PK = 0xC780,
C_VTR_SH = 0xC785,
/* Material chunks */
C_WORK_MTLS = 0xC790, /* Old-style -- now ignored */
C_WORK_MTLS_2 = 0xC792, /* Old-style -- now ignored */
C_WORK_MTLS_3 = 0xC793, /* Old-style -- now ignored */
C_WORK_MTLS_4 = 0xC794, /* Old-style -- now ignored */
C_WORK_MTLS_5 = 0xCB00, /* Old-style -- now ignored */
C_WORK_MTLS_6 = 0xCB01, /* Old-style -- now ignored */
C_WORK_MTLS_7 = 0xCB02, /* Old-style -- now ignored */
C_WORK_MTLS_8 = 0xCB03, /* Old-style -- now ignored */
C_WORKMTL = 0xCB04,
C_SXP_TEXT_DATA = 0xCB10,
C_SXP_TEXT2_DATA = 0xCB20,
C_SXP_OPAC_DATA = 0xCB11,
C_SXP_BUMP_DATA = 0xCB12,
C_SXP_SPEC_DATA = 0xCB24,
C_SXP_SHIN_DATA = 0xCB13,
C_SXP_SELFI_DATA = 0xCB28,
C_SXP_TEXT_MASKDATA = 0xCB30,
C_SXP_TEXT2_MASKDATA = 0xCB32,
C_SXP_OPAC_MASKDATA = 0xCB34,
C_SXP_BUMP_MASKDATA = 0xCB36,
C_SXP_SPEC_MASKDATA = 0xCB38,
C_SXP_SHIN_MASKDATA = 0xCB3A,
C_SXP_SELFI_MASKDATA = 0xC3C,
C_SXP_REFL_MASKDATA = 0xCB3E,
C_BGTYPE = 0xC7A1,
C_MEDTILE = 0xC7B0,
/* Contrast */
C_LO_CONTRAST = 0xC7D0,
C_HI_CONTRAST = 0xC7D1,
/* 3d frozen display */
C_FROZ_DISPLAY = 0xC7E0,
/* Booleans */
C_BOOLWELD = 0xc7f0,
C_BOOLTYPE = 0xc7f1,
C_ANG_THRESH = 0xC900,
C_SS_THRESH = 0xC901,
C_TEXTURE_BLUR_DEFAULT = 0xC903,
C_MAPDRAWER = 0xCA00,
C_MAPDRAWER1 = 0xCA01,
C_MAPDRAWER2 = 0xCA02,
C_MAPDRAWER3 = 0xCA03,
C_MAPDRAWER4 = 0xCA04,
C_MAPDRAWER5 = 0xCA05,
C_MAPDRAWER6 = 0xCA06,
C_MAPDRAWER7 = 0xCA07,
C_MAPDRAWER8 = 0xCA08,
C_MAPDRAWER9 = 0xCA09,
C_MAPDRAWER_ENTRY = 0xCA10,
/* System Options */
C_BACKUP_FILE = 0xCA20,
C_DITHER_256 = 0xCA21,
C_SAVE_LAST = 0xCA22,
C_USE_ALPHA = 0xCA23,
C_TGA_DEPTH = 0xCA24,
C_REND_FIELDS = 0xCA25,
C_REFLIP = 0xCA26,
C_SEL_ITEMTOG = 0xCA27,
C_SEL_RESET = 0xCA28,
C_STICKY_KEYINF = 0xCA29,
C_WELD_THRESHOLD = 0xCA2A,
C_ZCLIP_POINT = 0xCA2B,
C_ALPHA_SPLIT = 0xCA2C,
C_KF_SHOW_BACKFACE = 0xCA30,
C_OPTIMIZE_LOFT = 0xCA40,
C_TENS_DEFAULT = 0xCA42,
C_CONT_DEFAULT = 0xCA44,
C_BIAS_DEFAULT = 0xCA46,
C_DXFNAME_SRC = 0xCA50,
C_AUTO_WELD = 0xCA60,
C_AUTO_UNIFY = 0xCA70,
C_AUTO_SMOOTH = 0xCA80,
C_DXF_SMOOTH_ANG = 0xCA90,
C_SMOOTH_ANG = 0xCAA0,
/* Special network-use chunks */
C_NET_USE_VPOST = 0xCC00,
C_NET_USE_GAMMA = 0xCC10,
C_NET_FIELD_ORDER = 0xCC20,
C_BLUR_FRAMES = 0xCD00,
C_BLUR_SAMPLES = 0xCD10,
C_BLUR_DUR = 0xCD20,
C_HOT_METHOD = 0xCD30,
C_HOT_CHECK = 0xCD40,
C_PIXEL_SIZE = 0xCD50,
C_DISP_GAMMA = 0xCD60,
C_FBUF_GAMMA = 0xCD70,
C_FILE_OUT_GAMMA = 0xCD80,
C_FILE_IN_GAMMA = 0xCD82,
C_GAMMA_CORRECT = 0xCD84,
C_APPLY_DISP_GAMMA = 0xCD90, /* OBSOLETE */
C_APPLY_FBUF_GAMMA = 0xCDA0, /* OBSOLETE */
C_APPLY_FILE_GAMMA = 0xCDB0, /* OBSOLETE */
C_FORCE_WIRE = 0xCDC0,
C_RAY_SHADOWS = 0xCDD0,
C_MASTER_AMBIENT = 0xCDE0,
C_SUPER_SAMPLE = 0xCDF0,
C_OBJECT_MBLUR = 0xCE00,
C_MBLUR_DITHER = 0xCE10,
C_DITHER_24 = 0xCE20,
C_SUPER_BLACK = 0xCE30,
C_SAFE_FRAME = 0xCE40,
C_VIEW_PRES_RATIO = 0xCE50,
C_BGND_PRES_RATIO = 0xCE60,
C_NTH_SERIAL_NUM = 0xCE70,
/* Video Post */
VPDATA = 0xd000,
P_QUEUE_ENTRY = 0xd100,
P_QUEUE_IMAGE = 0xd110,
P_QUEUE_USEIGAMMA = 0xd114,
P_QUEUE_PROC = 0xd120,
P_QUEUE_SOLID = 0xd130,
P_QUEUE_GRADIENT = 0xd140,
P_QUEUE_KF = 0xd150,
P_QUEUE_MOTBLUR = 0xd152,
P_QUEUE_MB_REPEAT = 0xd153,
P_QUEUE_NONE = 0xd160,
P_QUEUE_RESIZE = 0xd180,
P_QUEUE_OFFSET = 0xd185,
P_QUEUE_ALIGN = 0xd190,
P_CUSTOM_SIZE = 0xd1a0,
P_ALPH_NONE = 0xd210,
P_ALPH_PSEUDO = 0xd220, /* Old chunk */
P_ALPH_OP_PSEUDO = 0xd221, /* Old chunk */
P_ALPH_BLUR = 0xd222, /* Replaces pseudo */
P_ALPH_PCOL = 0xd225,
P_ALPH_C0 = 0xd230,
P_ALPH_OP_KEY = 0xd231,
P_ALPH_KCOL = 0xd235,
P_ALPH_OP_NOCONV = 0xd238,
P_ALPH_IMAGE = 0xd240,
P_ALPH_ALPHA = 0xd250,
P_ALPH_QUES = 0xd260,
P_ALPH_QUEIMG = 0xd265,
P_ALPH_CUTOFF = 0xd270,
P_ALPHANEG = 0xd280,
P_TRAN_NONE = 0xd300,
P_TRAN_IMAGE = 0xd310,
P_TRAN_FRAMES = 0xd312,
P_TRAN_FADEIN = 0xd320,
P_TRAN_FADEOUT = 0xd330,
P_TRANNEG = 0xd340,
P_RANGES = 0xd400,
P_PROC_DATA = 0xd500
};
struct Vector2f {
float x, y;
} [[static]];
struct Vector3f {
float x, y, z;
} [[static]];
bitfield FaceFlags {
CA_Visible : 1;
BC_Visible : 1;
AB_Visible : 1;
Mapped : 1;
padding : 9;
CA_Selected : 1;
BC_Selected : 1;
AB_Selected : 1;
};
struct Face {
u16 v0, v1,v2;
FaceFlags flags;
};
bitfield VertexFlags {
padding : 13;
selected3 : 1;
selected2 : 1;
selected1 : 1;
};
bitfield KeyFlags1 {
Show_Path : 1;
Smooth : 1;
padding : 2;
Motion_Blur : 1;
padding : 1;
Morph_Mat : 1;
};
bitfield KeyFlags2 {
padding : 10;
Hidden : 1;
};
struct RGB<T> {
T r, g, b;
};
bitfield Spline {
Use_Tension : 1;
Use_Continuity : 1;
Use_Bias : 1;
Use_Ease_To : 1;
Use_Ease_From : 1;
padding : 3;
if (Use_Tension == 1)
float Tension;
if (Use_Continuity == 1)
float Continuity;
if (Use_Bias == 1)
float Bias;
if (Use_Ease_To == 1)
float Ease_To;
if (Use_Ease_From == 1)
float Ease_From;
padding : 8;
};
struct VectorKey {
u32 index;
Spline splineData;
Vector3f value;
};
struct RotationKey {
u32 index;
Spline splineData;
float angle;
Vector3f vector;
};
struct AngleKey {
u32 index;
Spline splineData;
float angle;
};
struct MorphKey{
u32 index;
Spline splineData;
char objectName[];
};
struct HideKey {
u32 index;
Spline splineData;
};
struct Keys<auto identifier> {
u32 count;
match (identifier) {
(
ChunkIdentifier::POS_TRACK_TAG |
ChunkIdentifier::SCL_TRACK_TAG |
ChunkIdentifier::COL_TRACK_TAG
) : {
VectorKey data[count];
}
(
ChunkIdentifier::ROT_TRACK_TAG
) : {
RotationKey data[count];
}
(
ChunkIdentifier::FOV_TRACK_TAG |
ChunkIdentifier::ROLL_TRACK_TAG |
ChunkIdentifier::HOT_TRACK_TAG |
ChunkIdentifier::FALL_TRACK_TAG
) : {
AngleKey data[count];
}
(
ChunkIdentifier::MORPH_TRACK_TAG
) : {
MorphKey data[count];
}
(
ChunkIdentifier::HIDE_TRACK_TAG
) : {
HideKey data[count];
}
}
};
enum TrackMode : u16 {
MODE_SINGLE = 0,
MODE_REPEAT = 1,
MODE_LOOP = 2,
};
bitfield TrackFlags {
TrackMode Mode : 2;
padding : 1;
Lock_X : 1;
Lock_Y : 1;
Lock_Z : 1;
padding : 1;
Unlink_X : 1;
Unlink_Y : 1;
Unlink_Z : 1;
};
struct Chunk {
ChunkIdentifier identifier;
u32 chunkSize;
u32 dataLength = chunkSize - 6 [[export]];
u32 chunkEnd = $ + dataLength;
if (chunkSize > 0) {
std::print("{}", identifier);
match (identifier) {
(
ChunkIdentifier::M3DMAGIC |
ChunkIdentifier::MDATA |
ChunkIdentifier::N_TRI_OBJECT |
ChunkIdentifier::KFDATA |
ChunkIdentifier::AMBIENT_NODE_TAG |
ChunkIdentifier::OBJECT_NODE_TAG |
ChunkIdentifier::CAMERA_NODE_TAG |
ChunkIdentifier::TARGET_NODE_TAG |
ChunkIdentifier::LIGHT_NODE_TAG |
ChunkIdentifier::L_TARGET_NODE_TAG |
ChunkIdentifier::SPOTLIGHT_NODE_TAG |
ChunkIdentifier::MAT_ENTRY |
ChunkIdentifier::MAT_AMBIENT |
ChunkIdentifier::MAT_DIFFUSE |
ChunkIdentifier::MAT_SPECULAR |
ChunkIdentifier::MAT_SHININESS |
ChunkIdentifier::MAT_SHIN2PCT |
ChunkIdentifier::MAT_SHIN3PCT |
ChunkIdentifier::MAT_TRANSPARENCY |
ChunkIdentifier::MAT_XPFALL |
ChunkIdentifier::MAT_REFBLUR |
ChunkIdentifier::MAT_SELF_ILPCT |
ChunkIdentifier::MAT_TEXMAP |
ChunkIdentifier::MAT_SPECMAP |
ChunkIdentifier::MAT_OPACMAP |
ChunkIdentifier::MAT_REFLMAP |
ChunkIdentifier::MAT_BUMPMAP |
ChunkIdentifier::MAT_BUMP_PERCENT |
ChunkIdentifier::MAT_TEX2MAP |
ChunkIdentifier::MAT_SHINMAP |
ChunkIdentifier::MAT_SELFIMAP |
ChunkIdentifier::MAT_TEXMASK |
ChunkIdentifier::MAT_TEX2MASK |
ChunkIdentifier::MAT_OPACMASK |
ChunkIdentifier::MAT_BUMPMASK |
ChunkIdentifier::MAT_SHINMASK |
ChunkIdentifier::MAT_SPECMASK |
ChunkIdentifier::MAT_SELFIMASK |
ChunkIdentifier::MAT_REFLMASK |
ChunkIdentifier::WORLD_VIEWPORT_DATA |
ChunkIdentifier::WORLD_VIEWPORT_DATA3 |
ChunkIdentifier::WORLD_VIEWPORT_LAYOUT |
ChunkIdentifier::SOLID_BGND |
ChunkIdentifier::AMBIENT_LIGHT
): {
Chunk chunks[while($ < chunkEnd)];
}
(
ChunkIdentifier::M3D_VERSION |
ChunkIdentifier::MESH_VERSION
): {
u32 version;
}
(
ChunkIdentifier::LO_SHADOW_BIAS |
ChunkIdentifier::HI_SHADOW_BIAS |
ChunkIdentifier::SHADOW_FILTER |
ChunkIdentifier::RAY_BIAS |
ChunkIdentifier::FLOAT_PERCENTAGE |
ChunkIdentifier::MASTER_SCALE |
ChunkIdentifier::MAT_MAP_TEXBLUR |
ChunkIdentifier::MAT_MAP_USCALE |
ChunkIdentifier::MAT_MAP_VSCALE |
ChunkIdentifier::MAT_MAP_UOFFSET |
ChunkIdentifier::MAT_MAP_VOFFSET |
ChunkIdentifier::MAT_MAP_ANG |
ChunkIdentifier::MAT_WIRESIZE |
ChunkIdentifier::DL_SPOT_ROLL |
ChunkIdentifier::MORPH_SMOOTH
): {
float value;
}
(
ChunkIdentifier::V_GRADIENT
) : {
float position;
Chunk chunks[while($ < chunkEnd)];
}
(
ChunkIdentifier::NAMED_OBJECT
) : {
char name[];
Chunk chunks[while($ < chunkEnd)];
}
(
ChunkIdentifier::POINT_ARRAY
) : {
u16 count;
Vector3f vectices[count] [[hex::visualize("3d", this, null)]];
}
(
ChunkIdentifier::TEX_VERTS
) : {
u16 count;
Vector2f coords[count];
}
(
ChunkIdentifier::MESH_MATRIX
) : {
Vector3f x, y, z, w;
}
(
ChunkIdentifier::FACE_ARRAY
) : {
u16 count;
Face faces[count];
Chunk chunks[while($ < chunkEnd)];
}
(
ChunkIdentifier::POINT_FLAG_ARRAY
) : {
u16 count;
VertexFlags flags[count];
}
(
ChunkIdentifier::SMOOTH_GROUP
) : {
u32 groups[dataLength / sizeof(u32)];
}
(
ChunkIdentifier::MESH_COLOR
) : {
u8 value;
}
(
ChunkIdentifier::MSH_MAT_GROUP
) : {
char name[];
u16 count;
u16 groups[count];
}
(
ChunkIdentifier::KFHDR
) : {
u16 revision;
char name[];
u32 animationLength;
}
(
ChunkIdentifier::KFSEG
) : {
u32 start, end;
}
(
ChunkIdentifier::KFCURTIME
) : {
u32 frameIndex;
}
(
ChunkIdentifier::NODE_ID
) : {
type::Hex<u16> id;
}
(
ChunkIdentifier::NODE_HDR
) : {
char name[];
padding[1];
KeyFlags1 flags1;
KeyFlags2 flags2;
type::Hex<u16> parentId;
}
(
ChunkIdentifier::PIVOT
) : {
Vector3f value;
}
(
ChunkIdentifier::BOUNDBOX
) : {
Vector3f min, max;
}
(
ChunkIdentifier::COLOR_24 |
ChunkIdentifier::LIN_COLOR_24
) : {
RGB<u8> color;
}
(
ChunkIdentifier::COLOR_F |
ChunkIdentifier::LIN_COLOR_F
) : {
RGB<float> color;
}
(
ChunkIdentifier::INT_PERCENTAGE |
ChunkIdentifier::MAT_BUMP_PERCENT
) : {
u16 value;
}
(
ChunkIdentifier::SHADOW_MAP_SIZE |
ChunkIdentifier::MAT_SHADING
) : {
u16 value;
}
(
ChunkIdentifier::POS_TRACK_TAG |
ChunkIdentifier::ROT_TRACK_TAG |
ChunkIdentifier::SCL_TRACK_TAG |
ChunkIdentifier::FOV_TRACK_TAG |
ChunkIdentifier::ROLL_TRACK_TAG |
ChunkIdentifier::COL_TRACK_TAG |
ChunkIdentifier::MORPH_TRACK_TAG |
ChunkIdentifier::HOT_TRACK_TAG |
ChunkIdentifier::FALL_TRACK_TAG |
ChunkIdentifier::HIDE_TRACK_TAG
) : {
TrackFlags flags;
u8 unknown[8];
Keys<identifier> keys;
}
(
ChunkIdentifier::INSTANCE_NAME |
ChunkIdentifier::BIT_MAP |
ChunkIdentifier::DL_SPOT_PROJECTOR |
ChunkIdentifier::MAT_NAME |
ChunkIdentifier::MAT_MAPNAME
) : {
char name[];
}
(
ChunkIdentifier::MAT_MAP_TILING
) : {
u16 tiling;
}
(
ChunkIdentifier::WORLD_VIEWPORT_SIZE
) : {
u16 x, y, w, h;
}
(
ChunkIdentifier::N_DIRECT_LIGHT
) : {
Vector3f position;
Chunk chunks[while($ < chunkEnd)];
}
(
ChunkIdentifier::DL_SPOTLIGHT
) : {
Vector3f target;
float hotspot, falloff;
Chunk chunks[while($ < chunkEnd)];
}
(
ChunkIdentifier::N_CAMERA
) : {
Vector3f position, target;
float roll, fov;
}
(_) : {
std::warning(std::format("Unhandled Chunk ID: {}, Skipping 0x{:04X} bytes", identifier, dataLength));
$ += dataLength;
}
}
}
};
Chunk chunk @ 0x00;