X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=model_brush.h;h=2998a1063e477d317803daf6f62499c63a90081e;hp=80756e39dbe76a30782eb1ae9525f490bd6a032c;hb=fabdca42b48cc4acf214c06adda9814e5cce8577;hpb=a0db60e28809c5d2e8898c61a765f3fc9dadca5d diff --git a/model_brush.h b/model_brush.h index 80756e39..2998a106 100644 --- a/model_brush.h +++ b/model_brush.h @@ -61,18 +61,34 @@ mplane_t; #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_CLIPSOLID 0x800 // this polygon can obscure other polygons +#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 SURFRENDER_OPAQUE 0 +#define SURFRENDER_ALPHA 1 +#define SURFRENDER_ADD 2 + 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); + void (*shaderfunc[SHADERSTAGE_COUNT])(const struct entity_render_s *ent, const struct texture_s *texture, const struct msurface_s *firstsurf); int flags; } Cshader_t; extern Cshader_t Cshader_wall_lightmap; -extern Cshader_t Cshader_wall_fullbright; extern Cshader_t Cshader_water; extern Cshader_t Cshader_sky; @@ -85,6 +101,9 @@ typedef struct texture_s // SURF_ flags unsigned int flags; + // type of rendering (SURFRENDER_ value) + int rendertype; + // base texture without fullbrights, never NULL rtexture_t *texture; // fullbrights texture, NULL if no fullbrights used @@ -93,13 +112,14 @@ typedef struct texture_s rtexture_t *fogtexture; // detail texture (usually not used if transparent) rtexture_t *detailtexture; + // normalmap for bumpmap shading + rtexture_t *nmaptexture; + // color filtering for glossy surfaces + rtexture_t *glosstexture; // shader to use for this texture Cshader_t *shader; - // list of surfaces to render using this texture - struct msurface_s *surfacechain; - // total frames in sequence and alternate sequence int anim_total[2]; // direct pointers to each of the frames in the sequences @@ -108,19 +128,12 @@ typedef struct texture_s // set if animated or there is an alternate frame set // (this is an optimization in the renderer) int animated; + // the current texture frames in animation + // (index with entity frame != 0) + struct texture_s *currentframe[2]; } texture_t; - -#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_CLIPSOLID 0x800 // this polygon can obscure other polygons - typedef struct { unsigned short v[2]; @@ -143,11 +156,15 @@ typedef struct surfmesh_s int numverts; int numtriangles; float *verts; + float *svectors; + float *tvectors; + float *normals; int *lightmapoffsets; - float *st; - float *uv; - float *ab; + float *str; + float *uvw; + float *abc; int *index; + int *triangleneighbors; } surfmesh_t; @@ -155,8 +172,8 @@ typedef struct msurface_s { // surface number, to avoid having to do a divide to find the number of a surface from it's address int number; - // should be drawn if visframe == r_framecount (set by WorldNode functions) - //int visframe; + // 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 @@ -177,7 +194,6 @@ typedef struct msurface_s short extents[2]; mtexinfo_t *texinfo; - texture_t *currenttexture; // updated (animated) during early surface processing each frame // index into d_lightstylevalue array, 255 means not used (black) qbyte styles[MAXLIGHTMAPS]; @@ -200,6 +216,11 @@ typedef struct msurface_s float *poly_verts; // bounding box for onscreen checks, and center for sorting vec3_t poly_mins, poly_maxs, poly_center; + // bounding sphere radius (around poly_center) + float poly_radius, poly_radius2; + + // neighboring surfaces (one per poly_numverts) + struct msurface_s **neighborsurfaces; // these are regenerated every frame // lighting info @@ -297,6 +318,16 @@ typedef struct mportal_s } mportal_t; +typedef struct svbspmesh_s +{ + struct svbspmesh_s *next; + int numverts, maxverts; + int numtriangles, maxtriangles; + float *verts; + int *elements; +} +svbspmesh_t; + typedef struct mlight_s { // location of light @@ -315,8 +346,20 @@ typedef struct mlight_s float distbias; // light style controlling this light int style; - // used only for loading calculations, number of leafs this shines on - //int numleafs; + // maximum extent of the light for shading purposes + float lightradius; + // maximum extent of the light for culling purposes + float cullradius; + float cullradius2; + // surfaces this shines on + int numsurfaces; + msurface_t **surfaces; + // lit area + vec3_t mins, maxs; + // precomputed shadow volume meshs + //svbspmesh_t *shadowvolume; + //vec3_t shadowvolumemins, shadowvolumemaxs; + shadowmesh_t *shadowvolume; } mlight_t;