]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_shadow.h
Added r_shadow_bouncegrid_lightpathsize which is an alternative to blur
[xonotic/darkplaces.git] / r_shadow.h
index 2e1a9d4cac078f34febd0bbb2a78de217ef2419a..685018a18279631dc8964da9050a2c6ba48dc236 100644 (file)
 #ifndef R_SHADOW_H
 #define R_SHADOW_H
 
+#define R_SHADOW_SHADOWMAP_NUMCUBEMAPS 8
+
+extern cvar_t r_shadow_bumpscale_basetexture;
+extern cvar_t r_shadow_bumpscale_bumpmap;
+extern cvar_t r_shadow_debuglight;
+extern cvar_t r_shadow_gloss;
+extern cvar_t r_shadow_gloss2intensity;
+extern cvar_t r_shadow_glossintensity;
+extern cvar_t r_shadow_glossexponent;
+extern cvar_t r_shadow_gloss2exponent;
+extern cvar_t r_shadow_glossexact;
+extern cvar_t r_shadow_lightattenuationpower;
 extern cvar_t r_shadow_lightattenuationscale;
 extern cvar_t r_shadow_lightintensityscale;
-extern cvar_t r_shadow_realtime_world;
+extern cvar_t r_shadow_lightradiusscale;
+extern cvar_t r_shadow_projectdistance;
+extern cvar_t r_shadow_frontsidecasting;
 extern cvar_t r_shadow_realtime_dlight;
-extern cvar_t r_shadow_visiblevolumes;
-extern cvar_t r_shadow_gloss;
-extern cvar_t r_shadow_debuglight;
-extern cvar_t r_shadow_bumpscale_bumpmap;
-extern cvar_t r_shadow_bumpscale_basetexture;
-extern cvar_t r_shadow_shadows;
-
-void R_Shadow_Init(void);
-void R_Shadow_Volume(int numverts, int numtris, const float *invertex3f, int *elements, int *neighbors, vec3_t relativelightorigin, float lightradius, float projectdistance);
-void R_Shadow_DiffuseLighting(int numverts, int numtriangles, const int *elements, const float *vertices, const float *svectors, const float *tvectors, const float *normals, const float *texcoords, const float *relativelightorigin, float lightradius, const float *lightcolor, const matrix4x4_t *matrix_worldtofilter, const matrix4x4_t *matrix_worldtoattenuationxyz, const matrix4x4_t *matrix_worldtoattenuationz, rtexture_t *basetexture, rtexture_t *bumptexture, rtexture_t *lightcubemap);
-void R_Shadow_SpecularLighting(int numverts, int numtriangles, const int *elements, const float *vertices, const float *svectors, const float *tvectors, const float *normals, const float *texcoords, const float *relativelightorigin, const float *relativeeyeorigin, float lightradius, const float *lightcolor, const matrix4x4_t *matrix_worldtofilter, const matrix4x4_t *matrix_worldtoattenuationxyz, const matrix4x4_t *matrix_worldtoattenuationz, rtexture_t *glosstexture, rtexture_t *bumptexture, rtexture_t *lightcubemap);
-void R_Shadow_ClearStencil(void);
+extern cvar_t r_shadow_realtime_dlight_shadows;
+extern cvar_t r_shadow_realtime_dlight_svbspculling;
+extern cvar_t r_shadow_realtime_dlight_portalculling;
+extern cvar_t r_shadow_realtime_world;
+extern cvar_t r_shadow_realtime_world_lightmaps;
+extern cvar_t r_shadow_realtime_world_shadows;
+extern cvar_t r_shadow_realtime_world_compile;
+extern cvar_t r_shadow_realtime_world_compileshadow;
+extern cvar_t r_shadow_realtime_world_compilesvbsp;
+extern cvar_t r_shadow_realtime_world_compileportalculling;
+extern cvar_t r_shadow_scissor;
+extern cvar_t r_shadow_polygonfactor;
+extern cvar_t r_shadow_polygonoffset;
+extern cvar_t r_shadow_texture3d;
+extern cvar_t gl_ext_separatestencil;
+extern cvar_t gl_ext_stenciltwoside;
 
-void R_Shadow_RenderShadowMeshVolume(shadowmesh_t *mesh);
-void R_Shadow_Stage_Begin(void);
-void R_Shadow_LoadWorldLightsIfNeeded(void);
-void R_Shadow_Stage_ShadowVolumes(void);
-void R_Shadow_Stage_LightWithShadows(void);
-void R_Shadow_Stage_LightWithoutShadows(void);
-void R_Shadow_Stage_End(void);
-int R_Shadow_ScissorForBBox(const float *mins, const float *maxs);
+// used by shader for bouncegrid feature
+typedef struct r_shadow_bouncegrid_settings_s
+{
+       qboolean staticmode;
+       qboolean bounceanglediffuse;
+       qboolean directionalshading;
+       qboolean includedirectlighting;
+       qboolean blur;
+       int floatcolors;
+       float dlightparticlemultiplier;
+       qboolean hitmodels;
+       float lightradiusscale;
+       int maxbounce;
+       int lightpathsize;
+       float particlebounceintensity;
+       float particleintensity;
+       int maxphotons;
+       float energyperphoton;
+       float spacing[3];
+       int stablerandom;
+}
+r_shadow_bouncegrid_settings_t;
 
-typedef struct worldlight_s
+typedef struct r_shadow_bouncegrid_state_s
 {
-       // saved properties
-       vec3_t origin;
-       vec_t lightradius;
-       vec3_t light;
-       vec3_t angles;
-       int castshadows;
-       char *cubemapname;
-
-       // shadow volumes are done entirely in model space, so there are no matrices for dealing with them...
-
-       // note that the world to light matrices are inversely scaled (divided) by lightradius
-
-       // matrix for transforming world coordinates to light filter coordinates
-       //matrix4x4_t matrix_worldtofilter;
-       // based on worldtofilter this transforms -1 to +1 to 0 to 1 for purposes
-       // of attenuation texturing in full 3D (z result often ignored)
-       //matrix4x4_t matrix_worldtoattenuationxyz;
-       // this transforms only the Z to S, and T is always 0.5
-       //matrix4x4_t matrix_worldtoattenuationz;
-
-       // generated properties
+       r_shadow_bouncegrid_settings_t settings;
+       qboolean capable;
+       qboolean allowdirectionalshading;
+       qboolean directional; // copied from settings.directionalshading after createtexture is decided
+       qboolean createtexture; // set to true to recreate the texture rather than updating it - happens when size changes or directional changes
+       rtexture_t *texture;
+       matrix4x4_t matrix;
+       vec_t intensity;
+       double lastupdatetime;
+       int resolution[3];
+       int numpixels;
+       int pixelbands;
+       int pixelsperband;
+       int bytesperband;
+       float spacing[3];
+       float ispacing[3];
        vec3_t mins;
        vec3_t maxs;
-       vec_t cullradius;
-       struct worldlight_s *next;
-       rtexture_t *cubemap;
-       int style;
-       int selected;
-
-       // premade shadow volumes and lit surfaces to render
-       shadowmesh_t *meshchain_shadow;
-       shadowmesh_t *meshchain_light;
+       vec3_t size;
+       int maxsplatpaths;
+
+       // per-frame data that is very temporary
+       int numsplatpaths;
+       struct r_shadow_bouncegrid_splatpath_s *splatpaths;
+       float *highpixels;
 }
-worldlight_t;
+r_shadow_bouncegrid_state_t;
+
+extern r_shadow_bouncegrid_state_t r_shadow_bouncegrid_state;
+
+void R_Shadow_Init(void);
+qboolean R_Shadow_ShadowMappingEnabled(void);
+void R_Shadow_VolumeFromList(int numverts, int numtris, const float *invertex3f, const int *elements, const int *neighbors, const vec3_t projectorigin, const vec3_t projectdirection, float projectdistance, int nummarktris, const int *marktris, vec3_t trismins, vec3_t trismaxs);
+void R_Shadow_ShadowMapFromList(int numverts, int numtris, const float *vertex3f, const int *elements, int numsidetris, const int *sidetotals, const unsigned char *sides, const int *sidetris);
+void R_Shadow_MarkVolumeFromBox(int firsttriangle, int numtris, const float *invertex3f, const int *elements, const vec3_t projectorigin, const vec3_t projectdirection, const vec3_t lightmins, const vec3_t lightmaxs, const vec3_t surfacemins, const vec3_t surfacemaxs);
+int R_Shadow_CalcTriangleSideMask(const vec3_t p1, const vec3_t p2, const vec3_t p3, float bias);
+int R_Shadow_CalcSphereSideMask(const vec3_t p1, float radius, float bias);
+int R_Shadow_ChooseSidesFromBox(int firsttriangle, int numtris, const float *invertex3f, const int *elements, const matrix4x4_t *worldtolight, const vec3_t projectorigin, const vec3_t projectdirection, const vec3_t lightmins, const vec3_t lightmaxs, const vec3_t surfacemins, const vec3_t surfacemaxs, int *totals);
+void R_Shadow_RenderLighting(int texturenumsurfaces, const msurface_t **texturesurfacelist);
+void R_Shadow_RenderMode_Begin(void);
+void R_Shadow_RenderMode_ActiveLight(const rtlight_t *rtlight);
+void R_Shadow_RenderMode_Reset(void);
+void R_Shadow_RenderMode_StencilShadowVolumes(qboolean zpass);
+void R_Shadow_RenderMode_Lighting(qboolean stenciltest, qboolean transparent, qboolean shadowmapping);
+void R_Shadow_RenderMode_DrawDeferredLight(qboolean stenciltest, qboolean shadowmapping);
+void R_Shadow_RenderMode_VisibleShadowVolumes(void);
+void R_Shadow_RenderMode_VisibleLighting(qboolean stenciltest, qboolean transparent);
+void R_Shadow_RenderMode_End(void);
+void R_Shadow_ClearStencil(void);
+void R_Shadow_SetupEntityLight(const entity_render_t *ent);
+
+qboolean R_Shadow_ScissorForBBox(const float *mins, const float *maxs);
 
-extern worldlight_t *r_shadow_worldlightchain;
+// these never change, they are used to create attenuation matrices
+extern matrix4x4_t matrix_attenuationxyz;
+extern matrix4x4_t matrix_attenuationz;
 
 void R_Shadow_UpdateWorldLightSelection(void);
 
-void R_Shadow_DrawStaticWorldLight_Shadow(worldlight_t *light, matrix4x4_t *matrix);
-void R_Shadow_DrawStaticWorldLight_Light(worldlight_t *light, matrix4x4_t *matrix, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltofilter, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz);
+extern rtlight_t *r_shadow_compilingrtlight;
+
+void R_RTLight_Update(rtlight_t *rtlight, int isstatic, matrix4x4_t *matrix, vec3_t color, int style, const char *cubemapname, int shadow, vec_t corona, vec_t coronasizescale, vec_t ambientscale, vec_t diffusescale, vec_t specularscale, int flags);
+void R_RTLight_Compile(rtlight_t *rtlight);
+void R_RTLight_Uncompile(rtlight_t *rtlight);
+
+void R_Shadow_PrepareLights(int fbo, rtexture_t *depthtexture, rtexture_t *colortexture);
+void R_Shadow_DrawPrepass(void);
+void R_Shadow_DrawLights(void);
+void R_Shadow_DrawCoronas(void);
+
+extern int maxshadowmark;
+extern int numshadowmark;
+extern int *shadowmark;
+extern int *shadowmarklist;
+extern int shadowmarkcount;
+void R_Shadow_PrepareShadowMark(int numtris);
+
+extern int maxshadowsides;
+extern int numshadowsides;
+extern unsigned char *shadowsides;
+extern int *shadowsideslist;
+void R_Shadow_PrepareShadowSides(int numtris);
+
+void R_Shadow_PrepareModelShadows(void);
+
+#define LP_LIGHTMAP            1
+#define LP_RTWORLD             2
+#define LP_DYNLIGHT            4
+void R_LightPoint(float *color, const vec3_t p, const int flags);
+void R_CompleteLightPoint(float *ambientcolor, float *diffusecolor, float *diffusenormal, const vec3_t p, const int flags);
+
+void R_DrawModelShadowMaps(int fbo, rtexture_t *depthtexture, rtexture_t *colortexture);
+void R_DrawModelShadows(int fbo, rtexture_t *depthtexture, rtexture_t *colortexture);
 
 #endif