From c053bcbe030930356bfbff004265d9550663d50d Mon Sep 17 00:00:00 2001 From: q66 Date: Sat, 2 May 2020 20:21:42 +0200 Subject: [PATCH] move octa apis to octa header --- src/engine/engine.hh | 54 -------------------- src/engine/light.cc | 1 + src/engine/octa.cc | 35 ++++++++----- src/engine/octa.hh | 109 ++++++++++++++++++++++++++++++++++++++++- src/engine/octaedit.cc | 1 + src/engine/physics.cc | 1 + src/engine/pvs.cc | 2 + src/engine/world.cc | 1 + src/engine/worldio.cc | 1 + src/shared/iengine.hh | 48 ------------------ 10 files changed, 139 insertions(+), 114 deletions(-) diff --git a/src/engine/engine.hh b/src/engine/engine.hh index fb9db37..694a75c 100644 --- a/src/engine/engine.hh +++ b/src/engine/engine.hh @@ -159,60 +159,6 @@ extern void endtimer(timer *t); // renderextras extern void render3dbox(vec &o, float tofloor, float toceil, float xradius, float yradius = 0); -// octa -extern cube *newcubes(uint face = F_EMPTY, int mat = MAT_AIR); -extern cubeext *growcubeext(cubeext *ext, int maxverts); -extern void setcubeext(cube &c, cubeext *ext); -extern cubeext *newcubeext(cube &c, int maxverts = 0, bool init = true); -extern void getcubevector(cube &c, int d, int x, int y, int z, ivec &p); -extern void setcubevector(cube &c, int d, int x, int y, int z, const ivec &p); -extern int familysize(const cube &c); -extern void freeocta(cube *c); -extern void discardchildren(cube &c, bool fixtex = false, int depth = 0); -extern void optiface(uchar *p, cube &c); -extern void validatec(cube *c, int size = 0); -extern bool isvalidcube(const cube &c); -extern ivec lu; -extern int lusize; -extern cube &lookupcube(const ivec &to, int tsize = 0, ivec &ro = lu, int &rsize = lusize); -extern const cube *neighbourstack[32]; -extern int neighbourdepth; -extern const cube &neighbourcube(const cube &c, int orient, const ivec &co, int size, ivec &ro = lu, int &rsize = lusize); -extern void resetclipplanes(); -extern int getmippedtexture(const cube &p, int orient); -extern void forcemip(cube &c, bool fixtex = true); -extern bool subdividecube(cube &c, bool fullcheck=true, bool brighten=true); -extern int faceconvexity(const ivec v[4]); -extern int faceconvexity(const ivec v[4], int &vis); -extern int faceconvexity(const vertinfo *verts, int numverts, int size); -extern int faceconvexity(const cube &c, int orient); -extern void calcvert(const cube &c, const ivec &co, int size, ivec &vert, int i, bool solid = false); -extern void calcvert(const cube &c, const ivec &co, int size, vec &vert, int i, bool solid = false); -extern uint faceedges(const cube &c, int orient); -extern bool collapsedface(const cube &c, int orient); -extern bool touchingface(const cube &c, int orient); -extern bool flataxisface(const cube &c, int orient); -extern bool collideface(const cube &c, int orient); -extern void genclipbounds(const cube &c, const ivec &co, int size, clipplanes &p); -extern int genclipplane(const cube &c, int i, vec *v, plane *clip); -extern void genclipplanes(const cube &c, const ivec &co, int size, clipplanes &p, bool collide = true, bool noclip = false); -extern bool visibleface(const cube &c, int orient, const ivec &co, int size, ushort mat = MAT_AIR, ushort nmat = MAT_AIR, ushort matmask = MATF_VOLUME); -extern int classifyface(const cube &c, int orient, const ivec &co, int size); -extern int visibletris(const cube &c, int orient, const ivec &co, int size, ushort vmat = MAT_AIR, ushort nmat = MAT_ALPHA, ushort matmask = MAT_ALPHA); -extern int visibleorient(const cube &c, int orient); -extern void genfaceverts(const cube &c, int orient, ivec v[4]); -extern int calcmergedsize(int orient, const ivec &co, int size, const vertinfo *verts, int numverts); -extern void invalidatemerges(cube &c, const ivec &co, int size, bool msg); -extern void calcmerges(); -extern int mergefaces(int orient, facebounds *m, int sz); -extern void mincubeface(const cube &cu, int orient, const ivec &o, int size, const facebounds &orig, facebounds &cf, ushort nmat = MAT_AIR, ushort matmask = MATF_VOLUME); -extern void remip(); - -static inline cubeext &ext(cube &c) -{ - return *(c.ext ? c.ext : newcubeext(c)); -} - // renderlights #include "renderlights.hh" diff --git a/src/engine/light.cc b/src/engine/light.cc index acbcc80..dcc9a24 100644 --- a/src/engine/light.cc +++ b/src/engine/light.cc @@ -1,4 +1,5 @@ #include "blend.hh" +#include "octa.hh" #include "texture.hh" #include "engine.hh" diff --git a/src/engine/octa.cc b/src/engine/octa.cc index 145725e..17aeb81 100644 --- a/src/engine/octa.cc +++ b/src/engine/octa.cc @@ -1,5 +1,6 @@ // core world management routines +#include "octa.hh" #include "world.hh" #include "engine.hh" @@ -107,6 +108,8 @@ void freecubeext(cube &c) } } +static int getmippedtexture(const cube &p, int orient); + void discardchildren(cube &c, bool fixtex, int depth) { c.material = MAT_AIR; @@ -308,7 +311,7 @@ const cube &neighbourcube(const cube &c, int orient, const ivec &co, int size, i ////////// (re)mip ////////// -int getmippedtexture(const cube &p, int orient) +static int getmippedtexture(const cube &p, int orient) { cube *c = p.children; int d = dimension(orient), dc = dimcoord(orient), texs[4] = { -1, -1, -1, -1 }, numtexs = 0; @@ -457,6 +460,8 @@ bool subdividecube(cube &c, bool fullcheck, bool brighten) bool crushededge(uchar e, int dc) { return dc ? e==0 : e==0x88; } +static bool touchingface(const cube &c, int orient); + int visibleorient(const cube &c, int orient) { loopi(2) @@ -566,6 +571,8 @@ bool remip(cube &c, const ivec &co, int size) return true; } +static void calcmerges(); + void remip() { remipprogress = 1; @@ -679,7 +686,7 @@ bool flataxisface(const cube &c, int orient) return (face&0x0F0F0F0F) == 0x01010101*(face&0x0F); } -bool collideface(const cube &c, int orient) +static bool collideface(const cube &c, int orient) { if(flataxisface(c, orient)) { @@ -691,7 +698,7 @@ bool collideface(const cube &c, int orient) return true; } -bool touchingface(const cube &c, int orient) +static bool touchingface(const cube &c, int orient) { uint face = c.faces[dimension(orient)]; return dimcoord(orient) ? (face&0xF0F0F0F0)==0x80808080 : (face&0x0F0F0F0F)==0; @@ -759,7 +766,7 @@ static inline void faceedges(const cube &c, int orient, uchar edges[4]) loopk(4) edges[k] = c.edges[faceedgesidx[orient][k]]; } -uint faceedges(const cube &c, int orient) +static uint faceedges(const cube &c, int orient) { union { uchar edges[4]; uint face; } u; faceedges(c, orient, u.edges); @@ -903,7 +910,7 @@ static inline int clipfacevecs(const ivec2 *o, int numo, int cx, int cy, int siz return r; } -bool collapsedface(const cube &c, int orient) +static bool collapsedface(const cube &c, int orient) { int e0 = c.edges[faceedgesidx[orient][0]], e1 = c.edges[faceedgesidx[orient][1]], e2 = c.edges[faceedgesidx[orient][2]], e3 = c.edges[faceedgesidx[orient][3]], @@ -1178,7 +1185,8 @@ int visibletris(const cube &c, int orient, const ivec &co, int size, ushort vmat return 3; } -void calcvert(const cube &c, const ivec &co, int size, ivec &v, int i, bool solid) +#if 0 +static void calcvert(const cube &c, const ivec &co, int size, ivec &v, int i, bool solid = false) { if(solid) v = cubecoords[i]; else gencubevert(c, i, v); // avoid overflow @@ -1186,8 +1194,9 @@ void calcvert(const cube &c, const ivec &co, int size, ivec &v, int i, bool soli else v.div(8/size); v.add(ivec(co).shl(3)); } +#endif -void calcvert(const cube &c, const ivec &co, int size, vec &v, int i, bool solid) +static void calcvert(const cube &c, const ivec &co, int size, vec &v, int i, bool solid = false) { if(solid) v = vec(cubecoords[i]); else gencubevert(c, i, v); v.mul(size/8.0f).add(vec(co)); @@ -1212,7 +1221,8 @@ void genclipbounds(const cube &c, const ivec &co, int size, clipplanes &p) p.visible = 0x80; } -int genclipplane(const cube &c, int orient, vec *v, plane *clip) +#if 0 +static int genclipplane(const cube &c, int orient, vec *v, plane *clip) { int planes = 0, convex = faceconvexity(c, orient), order = convex < 0 ? 1 : 0; const vec &v0 = v[fv[orient][order]], &v1 = v[fv[orient][order+1]], &v2 = v[fv[orient][order+2]], &v3 = v[fv[orient][(order+3)&3]]; @@ -1221,6 +1231,7 @@ int genclipplane(const cube &c, int orient, vec *v, plane *clip) if(v0!=v3 && v2!=v3 && (!planes || convex)) clip[planes++].toplane(v0, v2, v3); return planes; } +#endif void genclipplanes(const cube &c, const ivec &co, int size, clipplanes &p, bool collide, bool noclip) { @@ -1259,6 +1270,7 @@ void genclipplanes(const cube &c, const ivec &co, int size, clipplanes &p, bool } } +#if 0 static inline bool mergefacecmp(const facebounds &x, const facebounds &y) { if(x.v2 < y.v2) return true; @@ -1309,7 +1321,7 @@ static int mergeface(int orient, facebounds *m, int sz, facebounds &n) return sz; } -int mergefaces(int orient, facebounds *m, int sz) +static int mergefaces(int orient, facebounds *m, int sz) { quicksort(m, sz, mergefacecmp); @@ -1317,6 +1329,7 @@ int mergefaces(int orient, facebounds *m, int sz) loopi(sz) nsz = mergeface(orient, m, nsz, m[i]); return nsz; } +#endif struct cfkey { @@ -1336,7 +1349,7 @@ static inline uint hthash(const cfkey &k) return hthash(k.n)^k.offset^k.tex^k.orient^k.material; } -void mincubeface(const cube &cu, int orient, const ivec &o, int size, const facebounds &orig, facebounds &cf, ushort nmat, ushort matmask) +static void mincubeface(const cube &cu, int orient, const ivec &o, int size, const facebounds &orig, facebounds &cf, ushort nmat = MAT_AIR, ushort matmask = MATF_VOLUME) { int dim = dimension(orient); if(cu.children) @@ -1881,7 +1894,7 @@ void invalidatemerges(cube &c, const ivec &co, int size, bool msg) invalidatemerges(c); } -void calcmerges() +static void calcmerges() { genmergeprogress = 0; genmerges(); diff --git a/src/engine/octa.hh b/src/engine/octa.hh index c03655b..16d13b3 100644 --- a/src/engine/octa.hh +++ b/src/engine/octa.hh @@ -368,4 +368,111 @@ enum GENFACEVERTSXY(x0,x1, y0,y1, z0,z1, c0,c1, r0,r1, d0,d1) \ GENFACEVERTSZ(x0,x1, y0,y1, z0,z1, c0,c1, r0,r1, d0,d1) -#endif \ No newline at end of file +/* material flags and ids */ + +enum +{ + MATF_INDEX_SHIFT = 0, + MATF_VOLUME_SHIFT = 2, + MATF_CLIP_SHIFT = 5, + MATF_FLAG_SHIFT = 8, + + MATF_INDEX = 3 << MATF_INDEX_SHIFT, + MATF_VOLUME = 7 << MATF_VOLUME_SHIFT, + MATF_CLIP = 7 << MATF_CLIP_SHIFT, + MATF_FLAGS = 0xFF << MATF_FLAG_SHIFT +}; + +enum // cube empty-space materials +{ + MAT_AIR = 0, // the default, fill the empty space with air + MAT_WATER = 1 << MATF_VOLUME_SHIFT, // fill with water, showing waves at the surface + MAT_LAVA = 2 << MATF_VOLUME_SHIFT, // fill with lava + MAT_GLASS = 3 << MATF_VOLUME_SHIFT, // behaves like clip but is blended blueish + + MAT_NOCLIP = 1 << MATF_CLIP_SHIFT, // collisions always treat cube as empty + MAT_CLIP = 2 << MATF_CLIP_SHIFT, // collisions always treat cube as solid + MAT_GAMECLIP = 3 << MATF_CLIP_SHIFT, // game specific clip material + + MAT_DEATH = 1 << MATF_FLAG_SHIFT, // force player suicide + MAT_NOGI = 2 << MATF_FLAG_SHIFT, // disable global illumination + MAT_ALPHA = 4 << MATF_FLAG_SHIFT // alpha blended +}; + +#define isliquid(mat) ((mat)==MAT_WATER || (mat)==MAT_LAVA) +#define isclipped(mat) ((mat)==MAT_GLASS) +#define isdeadly(mat) ((mat)==MAT_LAVA) + +/* API */ + +void freeocta(cube *c); + +cube *newcubes(uint face = F_EMPTY, int mat = MAT_AIR); + +cubeext *growcubeext(cubeext *ext, int maxverts); +void setcubeext(cube &c, cubeext *ext); +cubeext *newcubeext(cube &c, int maxverts = 0, bool init = true); + +void getcubevector(cube &c, int d, int x, int y, int z, ivec &p); +void setcubevector(cube &c, int d, int x, int y, int z, const ivec &p); + +int familysize(const cube &c); + +void discardchildren(cube &c, bool fixtex = false, int depth = 0); + +void optiface(uchar *p, cube &c); +void validatec(cube *c, int size = 0); +bool isvalidcube(const cube &c); + +extern ivec lu; +extern int lusize; + +cube &lookupcube(const ivec &to, int tsize = 0, ivec &ro = lu, int &rsize = lusize); + +extern const cube *neighbourstack[32]; +extern int neighbourdepth; + +const cube &neighbourcube(const cube &c, int orient, const ivec &co, int size, ivec &ro = lu, int &rsize = lusize); + +void resetclipplanes(); +void forcemip(cube &c, bool fixtex = true); +bool subdividecube(cube &c, bool fullcheck=true, bool brighten=true); +int faceconvexity(const ivec v[4]); +int faceconvexity(const ivec v[4], int &vis); +int faceconvexity(const vertinfo *verts, int numverts, int size); +int faceconvexity(const cube &c, int orient); + +bool flataxisface(const cube &c, int orient); + +void genclipbounds(const cube &c, const ivec &co, int size, clipplanes &p); +void genclipplanes(const cube &c, const ivec &co, int size, clipplanes &p, bool collide = true, bool noclip = false); + +bool visibleface(const cube &c, int orient, const ivec &co, int size, ushort mat = MAT_AIR, ushort nmat = MAT_AIR, ushort matmask = MATF_VOLUME); +int classifyface(const cube &c, int orient, const ivec &co, int size); +int visibletris(const cube &c, int orient, const ivec &co, int size, ushort vmat = MAT_AIR, ushort nmat = MAT_ALPHA, ushort matmask = MAT_ALPHA); +int visibleorient(const cube &c, int orient); +void genfaceverts(const cube &c, int orient, ivec v[4]); +int calcmergedsize(int orient, const ivec &co, int size, const vertinfo *verts, int numverts); +void invalidatemerges(cube &c, const ivec &co, int size, bool msg); +void remip(); + +static inline cubeext &ext(cube &c) +{ + return *(c.ext ? c.ext : newcubeext(c)); +} + +int lookupmaterial(const vec &o); + +static inline bool insideworld(const vec &o) +{ + extern int worldsize; + return o.x>=0 && o.x=0 && o.y=0 && o.z=0 && o.x=0 && o.y=0 && o.z