prosperon/source/engine/3d/model.h

110 lines
2.2 KiB
C
Raw Normal View History

2021-11-30 21:29:18 -06:00
#ifndef MODEL_H
#define MODEL_H
2023-05-12 13:22:05 -05:00
#include "HandmadeMath.h"
2023-11-30 10:47:59 -06:00
#include "transform.h"
#include "sokol/sokol_gfx.h"
2023-12-11 08:36:45 -06:00
#include "gameobject.h"
2024-04-26 16:04:31 -05:00
#include "anim.h"
#include "texture.h"
2024-05-02 13:52:28 -05:00
#define MAT_POS 0
#define MAT_UV 1
#define MAT_NORM 2
#define MAT_BONE 3
#define MAT_WEIGHT 4
#define MAT_COLOR 5
#define MAT_TAN 6
2024-05-06 21:59:22 -05:00
#define MAT_ANGLE 7
#define MAT_WH 8
#define MAT_ST 9
#define MAT_PPOS 10
#define MAT_SCALE 11
2021-11-30 21:29:18 -06:00
2023-12-04 13:38:37 -06:00
typedef struct material {
2024-05-06 21:59:22 -05:00
struct texture *diffuse;
struct texture *metalrough;
2024-04-26 16:04:31 -05:00
float metal;
float rough;
2024-05-06 21:59:22 -05:00
struct texture *normal;
2024-04-26 16:04:31 -05:00
float nrm;
2024-05-06 21:59:22 -05:00
struct texture *occlusion;
2024-04-26 16:04:31 -05:00
float occl;
2024-05-06 21:59:22 -05:00
struct texture *emissive;
2024-04-26 16:04:31 -05:00
HMM_Vec3 emis;
2023-12-04 13:38:37 -06:00
} material;
struct model;
2024-04-26 16:04:31 -05:00
typedef struct primitive {
2024-04-30 10:32:27 -05:00
sg_buffer pos;
sg_buffer norm;
sg_buffer uv;
sg_buffer bone;
sg_buffer weight;
2024-05-02 13:52:28 -05:00
sg_buffer color;
2024-05-14 15:22:24 -05:00
sg_buffer index;
2024-04-30 10:32:27 -05:00
material *mat;
2024-04-26 16:04:31 -05:00
uint32_t idx_count;
} primitive;
2023-11-03 08:31:06 -05:00
/* A single mesh */
2023-12-04 13:38:37 -06:00
typedef struct mesh {
2024-04-26 16:04:31 -05:00
primitive *primitives;
HMM_Mat4 *m;
2023-12-04 13:38:37 -06:00
} mesh;
2024-04-26 16:04:31 -05:00
typedef struct joint {
int me;
struct joint *children;
} joint_t;
typedef struct md5joint {
struct md5joint *parent;
HMM_Vec4 pos;
HMM_Quat rot;
HMM_Vec4 scale;
HMM_Mat4 t;
} md5joint;
typedef struct skin {
md5joint **joints;
HMM_Mat4 *invbind;
HMM_Mat4 binds[50]; /* binds = joint * invbind */
md5joint *root;
} skin;
2023-11-03 08:31:06 -05:00
/* A collection of meshes which create a full figure */
2023-12-04 13:38:37 -06:00
typedef struct model {
2023-05-12 13:22:05 -05:00
struct mesh *meshes;
2024-04-26 16:04:31 -05:00
md5joint *nodes;
2024-04-30 10:32:27 -05:00
material *mats;
2024-04-26 16:04:31 -05:00
skin skin;
struct animation anim;
2023-12-04 13:38:37 -06:00
} model;
2021-11-30 21:29:18 -06:00
/* Make a Model struct */
2024-04-20 12:55:20 -05:00
struct model *model_make(const char *path);
void model_free(model *m);
2021-11-30 21:29:18 -06:00
2024-05-12 18:36:14 -05:00
void model_draw_go(model *m, transform *go);
2024-05-06 21:59:22 -05:00
sg_bindings primitive_bindings(primitive *p, JSValue pipe);
void primitive_gen_indices(primitive *prim);
int mat2type(int mat);
sg_buffer float_buffer(float *f, int v);
sg_buffer index_buffer(float *f, int verts);
sg_buffer texcoord_floats(float *f, int n);
sg_buffer par_idx_buffer(uint32_t *i, int v);
sg_buffer normal_floats(float *f, int n);
sg_buffer ubyten_buffer(float *f, int v);
sg_buffer ubyte_buffer(float *f, int v);
sg_buffer joint_buf(float *f, int v);
sg_buffer weight_buf(float *f, int v);
void primitive_free(primitive *prim);
2021-11-30 21:29:18 -06:00
2024-01-14 10:24:31 -06:00
material *material_make();
void material_free(material *mat);
2021-11-30 21:29:18 -06:00
#endif