X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=model_brush.h;h=0f2aadee76395977c8175c051532d4d3123e2102;hp=b4f76ac09b7c203e54f04cf8f662e1904eb0c7a0;hb=7ec560779c23a9cce62b3dee98785698d6ade6ef;hpb=bdbd009f72846eafb32d1efe43c521c22ca65fda diff --git a/model_brush.h b/model_brush.h index b4f76ac0..0f2aadee 100644 --- a/model_brush.h +++ b/model_brush.h @@ -29,6 +29,8 @@ BRUSH MODELS ============================================================================== */ +#define Q3PATHLENGTH 64 + // // in memory representation @@ -59,60 +61,54 @@ mplane_t; #define SHADERSTAGE_NORMAL 1 #define SHADERSTAGE_COUNT 2 -#define SHADERFLAGS_NEEDLIGHTMAP 1 - -#define SURF_PLANEBACK 2 -#define SURF_DRAWSKY 4 -#define SURF_DRAWTURB 0x10 -#define SURF_LIGHTMAP 0x20 -#define SURF_DRAWNOALPHA 0x100 -#define SURF_DRAWFULLBRIGHT 0x200 -#define SURF_LIGHTBOTHSIDES 0x400 -#define SURF_SHADOWCAST 0x1000 // this polygon can cast stencil shadows -#define SURF_SHADOWLIGHT 0x2000 // this polygon can be lit by stencil shadowing -#define SURF_WATERALPHA 0x4000 // this polygon's alpha is modulated by r_wateralpha -#define SURF_SOLIDCLIP 0x8000 // this polygon blocks movement - -#define SURFRENDER_OPAQUE 0 -#define SURFRENDER_ALPHA 1 -#define SURFRENDER_ADD 2 +//#define SURF_PLANEBACK 2 + +// set for anything to be transparent sorted +#define MATERIALFLAG_TRANSPARENT 1 +// use alpha blend on this material +#define MATERIALFLAG_ALPHA 2 +// use additive blend on this material +#define MATERIALFLAG_ADD 4 +// turn off depth test on this material +#define MATERIALFLAG_NODEPTHTEST 8 +// multiply alpha by r_wateralpha cvar +#define MATERIALFLAG_WATERALPHA 16 +// draw with no lighting +#define MATERIALFLAG_FULLBRIGHT 32 +// drawn as a normal lightmapped wall +#define MATERIALFLAG_WALL 64 +// swirling water effect +#define MATERIALFLAG_WATER 128 +// this surface shows the sky +// skipped if transparent +#define MATERIALFLAG_SKY 256 +// skips drawing the surface +#define MATERIALFLAG_NODRAW 512 +// probably used only on q1bsp water +#define MATERIALFLAG_LIGHTBOTHSIDES 1024 struct entity_render_s; struct texture_s; struct msurface_s; -// change this stuff when real shaders are added -typedef struct Cshader_s -{ - void (*shaderfunc[SHADERSTAGE_COUNT])(const struct entity_render_s *ent, const struct texture_s *texture, struct msurface_s **surfchain); - int flags; -} -Cshader_t; - -extern Cshader_t Cshader_wall_lightmap; -extern Cshader_t Cshader_water; -extern Cshader_t Cshader_sky; typedef struct texture_s { + // q1bsp // name - char name[16]; + //char name[16]; // size unsigned int width, height; // SURF_ flags - unsigned int flags; + //unsigned int flags; - // position in the model's textures array - int number; - - // type of rendering (SURFRENDER_ value) - int rendertype; + // base material flags + int basematerialflags; + // current material flags (updated each bmodel render) + int currentmaterialflags; // loaded the same as model skins skinframe_t skin; - // shader to use for this texture - Cshader_t *shader; - // total frames in sequence and alternate sequence int anim_total[2]; // direct pointers to each of the frames in the sequences @@ -125,6 +121,16 @@ typedef struct texture_s struct texture_s *currentframe; // current alpha of the texture float currentalpha; + + // q3bsp + char name[Q3PATHLENGTH]; + char firstpasstexturename[Q3PATHLENGTH]; // used only during loading + int surfaceflags; + int supercontents; + int surfaceparms; + int textureflags; + + //skinframe_t skin; } texture_t; @@ -142,111 +148,73 @@ typedef struct } mtexinfo_t; -// LordHavoc: replaces glpoly, triangle mesh -typedef struct surfmesh_s +typedef struct msurface_lightmapinfo_s { - int num_vertices; // number of vertices in the mesh - int num_triangles; // number of triangles in the mesh - float *data_vertex3f; // float[verts*3] vertex locations - float *data_svector3f; // float[verts*3] direction of 'S' (right) texture axis for each vertex - float *data_tvector3f; // float[verts*3] direction of 'T' (down) texture axis for each vertex - float *data_normal3f; // float[verts*3] direction of 'R' (out) texture axis for each vertex - int *data_lightmapoffsets; // index into surface's lightmap samples for vertex lighting - float *data_texcoordtexture2f; // float[verts*2] texcoords for surface texture - float *data_texcoordlightmap2f; // float[verts*2] texcoords for lightmap texture - float *data_texcoorddetail2f; // float[verts*2] texcoords for detail texture - int *data_element3i; // int[tris*3] triangles of the mesh, 3 indices into vertex arrays for each - int *data_neighbor3i; // int[tris*3] neighboring triangle on each edge (-1 if none) + // texture mapping properties used by this surface + mtexinfo_t *texinfo; // q1bsp + // index into d_lightstylevalue array, 255 means not used (black) + qbyte styles[MAXLIGHTMAPS]; // q1bsp + // RGB lighting data [numstyles][height][width][3] + qbyte *samples; // q1bsp + // stain to apply on lightmap (soot/dirt/blood/whatever) + qbyte *stainsamples; // q1bsp + // the stride when building lightmaps to comply with fragment update + int lightmaptexturestride; // q1bsp + int texturemins[2]; // q1bsp + int extents[2]; // q1bsp } -surfmesh_t; +msurface_lightmapinfo_t; +struct q3deffect_s; typedef struct msurface_s { // bounding box for onscreen checks - vec3_t poly_mins; - vec3_t poly_maxs; - - // the node plane this is on, backwards if SURF_PLANEBACK flag set - mplane_t *plane; - // SURF_ flags - int flags; - // texture mapping properties used by this surface - mtexinfo_t *texinfo; - + vec3_t mins; + vec3_t maxs; + // the texture to use on the surface + texture_t *texture; // the lightmap texture fragment to use on the rendering mesh rtexture_t *lightmaptexture; - // mesh for rendering - surfmesh_t mesh; - // if lightmap settings changed, this forces update - int cached_dlight; - - // should be drawn if visframe == r_framecount (set by PrepareSurfaces) - int visframe; - // should be drawn if onscreen and not a backface (used for setting visframe) - //int pvsframe; - // chain of surfaces marked visible by pvs - //struct msurface_s *pvschain; - // surface number, to avoid having to do a divide to find the number of a surface from it's address - int number; - - // center for sorting transparent meshes - vec3_t poly_center; - - // index into d_lightstylevalue array, 255 means not used (black) - qbyte styles[MAXLIGHTMAPS]; - // RGB lighting data [numstyles][height][width][3] - qbyte *samples; - // stain to apply on lightmap (soot/dirt/blood/whatever) - qbyte *stainsamples; - // the stride when building lightmaps to comply with fragment update - int lightmaptexturestride; - int texturemins[2]; - int extents[2]; - - // if this == r_framecount there are dynamic lights on the surface - int dlightframe; - // which dynamic lights are touching this surface - // (only access this if dlightframe is current) - int dlightbits[8]; - // avoid redundent addition of dlights - int lightframe; - - // avoid multiple collision traces with a surface polygon - int colframe; - - // these are just 3D points defining the outline of the polygon, - // no texcoord info (that can be generated from these) - int poly_numverts; - float *poly_verts; - - // index into model->brush.shadowmesh - int num_firstshadowmeshtriangle; - - // neighboring surfaces (one per poly_numverts) - //struct msurface_s **neighborsurfaces; - // currently used only for generating static shadow volumes - int lighttemp_castshadow; + // this surface is part of this mesh + surfmesh_t *groupmesh; + int num_triangles; // number of triangles in the mesh + int num_firsttriangle; // first triangle in the mesh (index into groupmesh) + int num_vertices; // number of vertices in the mesh + int num_firstvertex; // first vertex in the mesh (index into groupmesh) + + // shadow volume building information + int num_firstshadowmeshtriangle; // index into model->brush.shadowmesh + + // lightmaptexture rebuild information not used in q3bsp + int cached_dlight; // q1bsp // forces rebuild of lightmaptexture + msurface_lightmapinfo_t *lightmapinfo; // q1bsp + + // mesh information for collisions (only used by q3bsp curves) + int num_collisiontriangles; // q3bsp + int *data_collisionelement3i; // q3bsp + int num_collisionvertices; // q3bsp + float *data_collisionvertex3f; // q3bsp + struct q3deffect_s *effect; // q3bsp + // FIXME: collisionmarkframe should be kept in a separate array + int collisionmarkframe; // q3bsp // don't collide twice in one trace } msurface_t; typedef struct mnode_s { -// common with leaf - // always 0 in nodes - int contents; - + //this part shared between node and leaf + mplane_t *plane; // != NULL struct mnode_s *parent; struct mportal_s *portals; - // for bounding box culling vec3_t mins; vec3_t maxs; - mplane_t *plane; // != NULL -// node specific + // this part unique to node struct mnode_s *children[2]; + // q1bsp specific unsigned short firstsurface; unsigned short numsurfaces; } @@ -254,36 +222,25 @@ mnode_t; typedef struct mleaf_s { -// common with node - // always negative in leafs - int contents; - + //this part shared between node and leaf + mplane_t *plane; // == NULL struct mnode_s *parent; struct mportal_s *portals; - // for bounding box culling vec3_t mins; vec3_t maxs; - mplane_t *plane; // == NULL -// leaf specific - // next leaf in pvschain - struct mleaf_s *pvschain; - // potentially visible if current (model->pvsframecount) - int pvsframe; - // visible if marked current (r_framecount) - int visframe; - // used by certain worldnode variants to avoid processing the same leaf twice in a frame - int worldnodeframe; - // used by polygon-through-portals visibility checker - int portalmarkid; - - // -1 is not in pvs, >= 0 is pvs bit number - int clusterindex; - - int *firstmarksurface; - int nummarksurfaces; - qbyte ambient_sound_level[NUM_AMBIENTS]; + // this part unique to leaf + // common + int clusterindex; // -1 is not in pvs, >= 0 is pvs bit number + int areaindex; // q3bsp + int numleafsurfaces; + int *firstleafsurface; + int numleafbrushes; // q3bsp + int *firstleafbrush; // q3bsp + qbyte ambient_sound_level[NUM_AMBIENTS]; // q1bsp + int contents; // q1bsp: // TODO: remove (only used temporarily during loading when making collision hull 0) + int portalmarkid; // q1bsp // used by see-polygon-through-portals visibility checker } mleaf_t; @@ -304,10 +261,10 @@ typedef struct mportal_s struct mportal_s *next; // the next portal on this leaf mleaf_t *here; // the leaf this portal is on mleaf_t *past; // the leaf through this portal (infront) - mvertex_t *points; int numpoints; + mvertex_t *points; + vec3_t mins, maxs; // culling mplane_t plane; - int visframe; // is this portal visible this frame? } mportal_t; @@ -358,9 +315,6 @@ typedef struct mlight_s } mlight_t; -extern rtexture_t *r_notexture; -extern texture_t r_notexture_mip; - struct model_s; void Mod_Q1BSP_Load(struct model_s *mod, void *buffer); void Mod_IBSP_Load(struct model_s *mod, void *buffer); @@ -571,8 +525,6 @@ typedef struct #define Q3LUMP_PVS 16 // potentially visible set; bit[clusters][clusters] (used by rendering) #define Q3HEADER_LUMPS 17 -#define Q3PATHLENGTH 64 - typedef struct { int ident; @@ -660,7 +612,7 @@ typedef struct } q3dmeshvertex_t; -typedef struct +typedef struct q3deffect_s { char shadername[Q3PATHLENGTH]; int brushindex; @@ -769,8 +721,84 @@ typedef struct } q3dpvs_t; +// surfaceflags from bsp +#define Q3SURFACEFLAG_NODAMAGE 1 +#define Q3SURFACEFLAG_SLICK 2 +#define Q3SURFACEFLAG_SKY 4 +#define Q3SURFACEFLAG_LADDER 8 +#define Q3SURFACEFLAG_NOIMPACT 16 +#define Q3SURFACEFLAG_NOMARKS 32 +#define Q3SURFACEFLAG_FLESH 64 +#define Q3SURFACEFLAG_NODRAW 128 +#define Q3SURFACEFLAG_HINT 256 +#define Q3SURFACEFLAG_SKIP 512 +#define Q3SURFACEFLAG_NOLIGHTMAP 1024 +#define Q3SURFACEFLAG_POINTLIGHT 2048 +#define Q3SURFACEFLAG_METALSTEPS 4096 +#define Q3SURFACEFLAG_NOSTEPS 8192 +#define Q3SURFACEFLAG_NONSOLID 16384 +#define Q3SURFACEFLAG_LIGHTFILTER 32768 +#define Q3SURFACEFLAG_ALPHASHADOW 65536 +#define Q3SURFACEFLAG_NODLIGHT 131072 +#define Q3SURFACEFLAG_DUST 262144 + +// surfaceparms from shaders +#define Q3SURFACEPARM_ALPHASHADOW 1 +#define Q3SURFACEPARM_AREAPORTAL 2 +#define Q3SURFACEPARM_CLUSTERPORTAL 4 +#define Q3SURFACEPARM_DETAIL 8 +#define Q3SURFACEPARM_DONOTENTER 16 +#define Q3SURFACEPARM_FOG 32 +#define Q3SURFACEPARM_LAVA 64 +#define Q3SURFACEPARM_LIGHTFILTER 128 +#define Q3SURFACEPARM_METALSTEPS 256 +#define Q3SURFACEPARM_NODAMAGE 512 +#define Q3SURFACEPARM_NODLIGHT 1024 +#define Q3SURFACEPARM_NODRAW 2048 +#define Q3SURFACEPARM_NODROP 4096 +#define Q3SURFACEPARM_NOIMPACT 8192 +#define Q3SURFACEPARM_NOLIGHTMAP 16384 +#define Q3SURFACEPARM_NOMARKS 32768 +#define Q3SURFACEPARM_NOMIPMAPS 65536 +#define Q3SURFACEPARM_NONSOLID 131072 +#define Q3SURFACEPARM_ORIGIN 262144 +#define Q3SURFACEPARM_PLAYERCLIP 524288 +#define Q3SURFACEPARM_SKY 1048576 +#define Q3SURFACEPARM_SLICK 2197152 +#define Q3SURFACEPARM_SLIME 4194304 +#define Q3SURFACEPARM_STRUCTURAL 8388608 +#define Q3SURFACEPARM_TRANS 16777216 +#define Q3SURFACEPARM_WATER 33554432 +#define Q3SURFACEPARM_POINTLIGHT 67108864 + +// various flags from shaders +#define Q3TEXTUREFLAG_TWOSIDED 1 +#define Q3TEXTUREFLAG_ADDITIVE 2 +#define Q3TEXTUREFLAG_NOMIPMAPS 4 +#define Q3TEXTUREFLAG_NOPICMIP 8 +#define Q3TEXTUREFLAG_AUTOSPRITE 16 +#define Q3TEXTUREFLAG_AUTOSPRITE2 32 +#define Q3TEXTUREFLAG_ALPHATEST 64 + +typedef struct q3mbrush_s +{ + struct colbrushf_s *colbrushf; + int numbrushsides; + struct q3mbrushside_s *firstbrushside; + struct texture_s *texture; +} +q3mbrush_t; + +typedef struct q3mbrushside_s +{ + struct mplane_s *plane; + struct texture_s *texture; +} +q3mbrushside_t; + #define CHECKPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] & (1 << ((b) & 7))) : false) #define SETPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] |= (1 << ((b) & 7))) : false) +#define CLEARPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] &= ~(1 << ((b) & 7))) : false) #endif