Made the M3D SDK C++ wrapper optional
parent
3bf81375da
commit
8ebd48442e
|
@ -1899,26 +1899,7 @@ static char *_m3d_getfloat(char *s, M3D_FLOAT *ret)
|
||||||
return _m3d_findarg(e);
|
return _m3d_findarg(e);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if !defined(M3D_NODUP) && (defined(M3D_ASCII) || defined(M3D_EXPORTER))
|
#if !defined(M3D_NODUP) && (!defined(M3D_NONORMALS) || defined(M3D_EXPORTER))
|
||||||
m3ds_t *_m3d_addskin(m3ds_t *skin, uint32_t *numskin, m3ds_t *s, uint32_t *idx)
|
|
||||||
{
|
|
||||||
uint32_t i;
|
|
||||||
M3D_FLOAT w = (M3D_FLOAT)0.0;
|
|
||||||
for(i = 0; i < M3D_NUMBONE && s->weight[i] > (M3D_FLOAT)0.0; i++)
|
|
||||||
w += s->weight[i];
|
|
||||||
if(w != (M3D_FLOAT)1.0 && w != (M3D_FLOAT)0.0)
|
|
||||||
for(i = 0; i < M3D_NUMBONE && s->weight[i] > (M3D_FLOAT)0.0; i++)
|
|
||||||
s->weight[i] /= w;
|
|
||||||
if(skin) {
|
|
||||||
for(i = 0; i < *numskin; i++)
|
|
||||||
if(!memcmp(&skin[i], s, sizeof(m3ds_t))) { *idx = i; return skin; }
|
|
||||||
}
|
|
||||||
skin = (m3ds_t*)M3D_REALLOC(skin, ((*numskin) + 1) * sizeof(m3ds_t));
|
|
||||||
memcpy(&skin[*numskin], s, sizeof(m3ds_t));
|
|
||||||
*idx = *numskin;
|
|
||||||
(*numskin)++;
|
|
||||||
return skin;
|
|
||||||
}
|
|
||||||
/* add vertex to list, only compare x,y,z */
|
/* add vertex to list, only compare x,y,z */
|
||||||
m3dv_t *_m3d_addnorm(m3dv_t *vrtx, uint32_t *numvrtx, m3dv_t *v, uint32_t *idx)
|
m3dv_t *_m3d_addnorm(m3dv_t *vrtx, uint32_t *numvrtx, m3dv_t *v, uint32_t *idx)
|
||||||
{
|
{
|
||||||
|
@ -1939,6 +1920,27 @@ m3dv_t *_m3d_addnorm(m3dv_t *vrtx, uint32_t *numvrtx, m3dv_t *v, uint32_t *idx)
|
||||||
(*numvrtx)++;
|
(*numvrtx)++;
|
||||||
return vrtx;
|
return vrtx;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if !defined(M3D_NODUP) && (defined(M3D_ASCII) || defined(M3D_EXPORTER))
|
||||||
|
m3ds_t *_m3d_addskin(m3ds_t *skin, uint32_t *numskin, m3ds_t *s, uint32_t *idx)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
M3D_FLOAT w = (M3D_FLOAT)0.0;
|
||||||
|
for(i = 0; i < M3D_NUMBONE && s->weight[i] > (M3D_FLOAT)0.0; i++)
|
||||||
|
w += s->weight[i];
|
||||||
|
if(w != (M3D_FLOAT)1.0 && w != (M3D_FLOAT)0.0)
|
||||||
|
for(i = 0; i < M3D_NUMBONE && s->weight[i] > (M3D_FLOAT)0.0; i++)
|
||||||
|
s->weight[i] /= w;
|
||||||
|
if(skin) {
|
||||||
|
for(i = 0; i < *numskin; i++)
|
||||||
|
if(!memcmp(&skin[i], s, sizeof(m3ds_t))) { *idx = i; return skin; }
|
||||||
|
}
|
||||||
|
skin = (m3ds_t*)M3D_REALLOC(skin, ((*numskin) + 1) * sizeof(m3ds_t));
|
||||||
|
memcpy(&skin[*numskin], s, sizeof(m3ds_t));
|
||||||
|
*idx = *numskin;
|
||||||
|
(*numskin)++;
|
||||||
|
return skin;
|
||||||
|
}
|
||||||
/* helper function to create safe strings */
|
/* helper function to create safe strings */
|
||||||
char *_m3d_safestr(char *in, int morelines)
|
char *_m3d_safestr(char *in, int morelines)
|
||||||
{
|
{
|
||||||
|
@ -2089,19 +2091,6 @@ _inline static unsigned char *_m3d_getidx(unsigned char *data, char type, M3D_IN
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fast inverse square root calculation. returns 1/sqrt(x) */
|
|
||||||
static M3D_FLOAT _m3d_rsq(M3D_FLOAT x)
|
|
||||||
{
|
|
||||||
#ifdef M3D_DOUBLE
|
|
||||||
return ((M3D_FLOAT)15.0/(M3D_FLOAT)8.0) + ((M3D_FLOAT)-5.0/(M3D_FLOAT)4.0)*x + ((M3D_FLOAT)3.0/(M3D_FLOAT)8.0)*x*x;
|
|
||||||
#else
|
|
||||||
/* John Carmack's */
|
|
||||||
float x2 = x * 0.5f;
|
|
||||||
*((uint32_t*)&x) = (0x5f3759df - (*((uint32_t*)&x) >> 1));
|
|
||||||
return x * (1.5f - (x2 * x * x));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef M3D_NOANIMATION
|
#ifndef M3D_NOANIMATION
|
||||||
/* multiply 4 x 4 matrices. Do not use float *r[16] as argument, because some compilers misinterpret that as
|
/* multiply 4 x 4 matrices. Do not use float *r[16] as argument, because some compilers misinterpret that as
|
||||||
* 16 pointers each pointing to a float, but we need a single pointer to 16 floats. */
|
* 16 pointers each pointing to a float, but we need a single pointer to 16 floats. */
|
||||||
|
@ -2176,6 +2165,20 @@ void _m3d_mat(M3D_FLOAT *r, m3dv_t *p, m3dv_t *q)
|
||||||
r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1;
|
r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(M3D_NOANIMATION) || !defined(M3D_NONORMALS)
|
||||||
|
/* fast inverse square root calculation. returns 1/sqrt(x) */
|
||||||
|
static M3D_FLOAT _m3d_rsq(M3D_FLOAT x)
|
||||||
|
{
|
||||||
|
#ifdef M3D_DOUBLE
|
||||||
|
return ((M3D_FLOAT)15.0/(M3D_FLOAT)8.0) + ((M3D_FLOAT)-5.0/(M3D_FLOAT)4.0)*x + ((M3D_FLOAT)3.0/(M3D_FLOAT)8.0)*x*x;
|
||||||
|
#else
|
||||||
|
/* John Carmack's */
|
||||||
|
float x2 = x * 0.5f;
|
||||||
|
*((uint32_t*)&x) = (0x5f3759df - (*((uint32_t*)&x) >> 1));
|
||||||
|
return x * (1.5f - (x2 * x * x));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to decode a Model 3D into in-memory format
|
* Function to decode a Model 3D into in-memory format
|
||||||
|
@ -2183,12 +2186,19 @@ void _m3d_mat(M3D_FLOAT *r, m3dv_t *p, m3dv_t *q)
|
||||||
m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d_t *mtllib)
|
m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d_t *mtllib)
|
||||||
{
|
{
|
||||||
unsigned char *end, *chunk, *buff, weights[8];
|
unsigned char *end, *chunk, *buff, weights[8];
|
||||||
unsigned int i, j, k, n, am, len = 0, reclen, offs, numnorm = 0;
|
unsigned int i, j, k, n, am, len = 0, reclen, offs;
|
||||||
char *material;
|
char *material;
|
||||||
|
#ifndef M3D_NONORMALS
|
||||||
|
unsigned int numnorm = 0;
|
||||||
m3dv_t *norm = NULL, *v0, *v1, *v2, va, vb, vn;
|
m3dv_t *norm = NULL, *v0, *v1, *v2, va, vb, vn;
|
||||||
|
M3D_INDEX *ni = NULL, *vi = NULL;
|
||||||
|
#endif
|
||||||
m3d_t *model;
|
m3d_t *model;
|
||||||
M3D_INDEX mi, *ni = NULL, *vi = NULL;
|
M3D_INDEX mi;
|
||||||
M3D_FLOAT w, r[16];
|
M3D_FLOAT w;
|
||||||
|
#ifndef M3D_NOANIMATION
|
||||||
|
M3D_FLOAT r[16];
|
||||||
|
#endif
|
||||||
m3dtx_t *tx;
|
m3dtx_t *tx;
|
||||||
m3dm_t *m;
|
m3dm_t *m;
|
||||||
m3da_t *a;
|
m3da_t *a;
|
||||||
|
@ -3000,8 +3010,11 @@ memerr: M3D_LOG("Out of memory");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* calculate normals, normalize skin weights, create bone/vertex cross-references and calculate transform matrices */
|
/* calculate normals, normalize skin weights, create bone/vertex cross-references and calculate transform matrices */
|
||||||
|
#ifdef M3D_ASCII
|
||||||
postprocess:
|
postprocess:
|
||||||
|
#endif
|
||||||
if(model) {
|
if(model) {
|
||||||
|
#ifndef M3D_NONORMALS
|
||||||
if(model->numface && model->face) {
|
if(model->numface && model->face) {
|
||||||
memset(&vn, 0, sizeof(m3dv_t));
|
memset(&vn, 0, sizeof(m3dv_t));
|
||||||
/* if they are missing, calculate triangle normals into a temporary buffer */
|
/* if they are missing, calculate triangle normals into a temporary buffer */
|
||||||
|
@ -3049,7 +3062,9 @@ postprocess:
|
||||||
M3D_FREE(vi);
|
M3D_FREE(vi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if(model->numbone && model->bone && model->numskin && model->skin && model->numvertex && model->vertex) {
|
if(model->numbone && model->bone && model->numskin && model->skin && model->numvertex && model->vertex) {
|
||||||
|
#ifndef M3D_NOWEIGHTS
|
||||||
for(i = 0; i < model->numvertex; i++) {
|
for(i = 0; i < model->numvertex; i++) {
|
||||||
if(model->vertex[i].skinid < M3D_INDEXMAX) {
|
if(model->vertex[i].skinid < M3D_INDEXMAX) {
|
||||||
sk = &model->skin[model->vertex[i].skinid];
|
sk = &model->skin[model->vertex[i].skinid];
|
||||||
|
@ -3067,6 +3082,7 @@ postprocess:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#ifndef M3D_NOANIMATION
|
#ifndef M3D_NOANIMATION
|
||||||
for(i = 0; i < model->numbone; i++) {
|
for(i = 0; i < model->numbone; i++) {
|
||||||
b = &model->bone[i];
|
b = &model->bone[i];
|
||||||
|
@ -4317,7 +4333,7 @@ memerr: if(face) M3D_FREE(face);
|
||||||
/* zlib compress */
|
/* zlib compress */
|
||||||
if(!(flags & M3D_EXP_NOZLIB)) {
|
if(!(flags & M3D_EXP_NOZLIB)) {
|
||||||
z = stbi_zlib_compress((unsigned char *)h, len, (int*)&l, 9);
|
z = stbi_zlib_compress((unsigned char *)h, len, (int*)&l, 9);
|
||||||
if(z && l > 0) { len = l; M3D_FREE(h); h = (m3dhdr_t*)z; }
|
if(z && l > 0 && l < len) { len = l; M3D_FREE(h); h = (m3dhdr_t*)z; }
|
||||||
}
|
}
|
||||||
/* add file header at the begining */
|
/* add file header at the begining */
|
||||||
len += 8;
|
len += 8;
|
||||||
|
@ -4346,7 +4362,7 @@ memerr: if(face) M3D_FREE(face);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
#ifdef M3D_CPPWRAPPER
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -4538,6 +4554,7 @@ namespace M3D {
|
||||||
|
|
||||||
#endif /* impl */
|
#endif /* impl */
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue