X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=libs%2Fgoat3d%2Fsrc%2Fchunk.h;fp=libs%2Fgoat3d%2Fsrc%2Fchunk.h;h=19c1bbd4a678357c911ce23b47a94a14700065ef;hb=d5f45e3128c537f272615cf76242e1dfebccdee7;hp=0000000000000000000000000000000000000000;hpb=dd7ce87b0ad2b8a1b4758bcc9354e993b71c8599;p=raydungeon diff --git a/libs/goat3d/src/chunk.h b/libs/goat3d/src/chunk.h new file mode 100644 index 0000000..19c1bbd --- /dev/null +++ b/libs/goat3d/src/chunk.h @@ -0,0 +1,138 @@ +/* +goat3d - 3D scene, and animation file format library. +Copyright (C) 2013-2023 John Tsiombikas + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program. If not, see . +*/ +#ifndef CHUNK_H_ +#define CHUNK_H_ + +#include "util.h" + +enum { + CNK_INVALID, /* this shouldn't appear in files */ + CNK_SCENE, /* the root chunk */ + + /* general purpose chunks */ + CNK_INT, + CNK_INT4, + CNK_FLOAT, + CNK_FLOAT3, + CNK_FLOAT4, + CNK_STRING, + + /* --- first level chunks --- */ + /* children of CNK_SCENE */ + CNK_ENV, /* environmental parameters */ + CNK_MTL, /* material */ + CNK_MESH, + CNK_LIGHT, + CNK_CAMERA, + CNK_NODE, + + /* --- second level chunks --- */ + /* children of CNK_ENV */ + CNK_ENV_AMBIENT, /* ambient color, contains a single CNK_FLOAT3 */ + CNK_ENV_FOG, + + /* --- third level chunks --- */ + /* children of CNK_FOG */ + CNK_FOG_COLOR, /* fog color, contains a single CNK_FLOAT3 */ + CNK_FOG_EXP, /* fog exponent, contains a single CNK_FLOAT */ + + /* children of CNK_MTL */ + CNK_MTL_NAME, /* has a single CNK_STRING */ + CNK_MTL_ATTR, /* material attribute, has a CNK_STRING for its name, */ + /* a CNK_MTL_ATTR_VAL, and optionally a CNK_MTL_ATTR_MAP */ + /* children of CNK_MTL_ATTR */ + CNK_MTL_ATTR_NAME, /* has a single CNK_STRING */ + CNK_MTL_ATTR_VAL, /* can have a single CNK_FLOAT, CNK_FLOAT3, or CNK_FLOAT4 */ + CNK_MTL_ATTR_MAP, /* has a single CNK_STRING */ + + /* children of CNK_MESH */ + CNK_MESH_NAME, /* has a single CNK_STRING */ + CNK_MESH_MATERIAL, /* has one of CNK_STRING or CNK_INT to identify the material */ + CNK_MESH_VERTEX_LIST, /* has a series of CNK_FLOAT3 chunks */ + CNK_MESH_NORMAL_LIST, /* has a series of CNK_FLOAT3 chunks */ + CNK_MESH_TANGENT_LIST, /* has a series of CNK_FLOAT3 chunks */ + CNK_MESH_TEXCOORD_LIST, /* has a series of CNK_FLOAT3 chunks */ + CNK_MESH_SKINWEIGHT_LIST, /* has a series of CNK_FLOAT4 chunks (4 skin weights) */ + CNK_MESH_SKINMATRIX_LIST, /* has a series of CNK_INT4 chunks (4 matrix indices) */ + CNK_MESH_COLOR_LIST, /* has a series of CNK_FLOAT4 chunks */ + CNK_MESH_BONES_LIST, /* has a series of CNK_INT or CNK_STRING chunks identifying the bone nodes */ + CNK_MESH_FACE_LIST, /* has a series of CNK_FACE chunks */ + CNK_MESH_FILE, /* optionally mesh data may be in another file, has a CNK_STRING filename */ + + /* child of CNK_MESH_FACE_LIST */ + CNK_MESH_FACE, /* has three CNK_INT chunks */ + + /* children of CNK_LIGHT */ + CNK_LIGHT_NAME, /* has a single CNK_STRING */ + CNK_LIGHT_POS, /* has a single CNK_FLOAT3 */ + CNK_LIGHT_COLOR, /* has a single CNK_FLOAT3 */ + CNK_LIGHT_ATTEN, /* has a single CNK_FLOAT3 (constant, linear, squared attenuation) */ + CNK_LIGHT_DISTANCE, /* has a single CNK_FLOAT */ + CNK_LIGHT_DIR, /* a single CNK_FLOAT3 (for spotlights and dir-lights) */ + CNK_LIGHT_CONE_INNER, /* single CNK_FLOAT, inner cone angle (for spotlights) */ + CNK_LIGHT_CONE_OUTER, /* single CNK_FLOAT, outer cone angle (for spotlights) */ + + /* children of CNK_CAMERA */ + CNK_CAMERA_NAME, /* has a single CNK_STRING */ + CNK_CAMERA_POS, /* single CNK_FLOAT3 */ + CNK_CAMERA_TARGET, /* single CNK_FLOAT3 */ + CNK_CAMERA_FOV, /* single CNK_FLOAT (field of view in radians) */ + CNK_CAMERA_NEARCLIP, /* single CNK_FLOAT (near clipping plane distance) */ + CNK_CAMERA_FARCLIP, /* signle CNK_FLOAT (far clipping plane distance) */ + + /* children of CNK_NODE */ + CNK_NODE_NAME, /* node name, a single CNK_STRING */ + CNK_NODE_PARENT, /* it can have a CNK_INT or a CNK_STRING to identify the parent node */ + + CNK_NODE_MESH, /* it can have a CNK_INT or a CNK_STRING to identify this node's mesh */ + CNK_NODE_LIGHT, /* same as CNK_NODE_MESH */ + CNK_NODE_CAMERA, /* same as CNK_NODE_MESH */ + + CNK_NODE_POS, /* has a CNK_FLOAT3, position vector */ + CNK_NODE_ROT, /* has a CNK_FLOAT4, rotation quaternion (x, y, z imaginary, w real) */ + CNK_NODE_SCALE, /* has a CNK_FLOAT3, scaling */ + CNK_NODE_PIVOT, /* has a CNK_FLOAT3, pivot point */ + + CNK_NODE_MATRIX0, /* has a CNK_FLOAT4, first matrix row (4x3) */ + CNK_NODE_MATRXI1, /* has a CNK_FLOAT4, second matrix row (4x3) */ + CNK_NODE_MATRIX2, /* has a CNK_FLOAT4, third matrix row (4x3) */ + + CNK_ANIM, /* the animation root chunk */ + + MAX_NUM_CHUNKS +}; + +#define UNKNOWN_SIZE ((uint32_t)0xbaadf00d) + +struct chunk_header { + uint32_t id; + uint32_t size; +}; + +struct chunk { + struct chunk_header hdr; + char data[1]; +}; + + +void g3dimpl_chunk_header(struct chunk_header *hdr, int id); +int g3dimpl_write_chunk_header(const struct chunk_header *hdr, struct goat3d_io *io); +int g3dimpl_read_chunk_header(struct chunk_header *hdr, struct goat3d_io *io); +void g3dimpl_skip_chunk(const struct chunk_header *hdr, struct goat3d_io *io); + +#endif /* CHUNK_H_ */