diff --git a/ref/null/r_context.c b/ref/null/r_context.c new file mode 100644 index 00000000..de4f176b --- /dev/null +++ b/ref/null/r_context.c @@ -0,0 +1,623 @@ +/* +r_context.c -- null renderer context +Copyright (C) 2023-2024 a1batross + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +*/ + +#include +#include "xash3d_types.h" +#include "const.h" +#include "cvardef.h" +#include "xash3d_mathlib.h" +#include "ref_api.h" + +/* + * this initially was made to be able to run full client + * in hazardous^Wheadless environments + * but might be a starting point for new renderers as well + */ + +static ref_api_t gEngfuncs; +static ref_globals_t *gpGlobals; + +static void R_SimpleStub( void ) +{ + ; +} + +static void R_SimpleStubInt( int ) +{ + ; +} + +static void R_SimpleStubUInt( unsigned int ) +{ + ; +} + +static void R_SimpleStubBool( qboolean ) +{ + ; +} + +static qboolean R_Init( void ) +{ + return true; +} + +static const char *R_GetConfigName( void ) +{ + return NULL; +} + +static qboolean R_SetDisplayTransform( ref_screen_rotation_t rotate, int x, int y, float scale_x, float scale_y ) +{ + return true; +} + +static void GL_SetupAttributes( int safegl ) +{ + ; +} + +static qboolean R_AddEntity( struct cl_entity_s *clent, int type ) +{ + return true; +} + +static void CL_AddCustomBeam( cl_entity_t *pEnvBeam ) +{ + ; +} + +static void R_ProcessEntData( qboolean allocate, cl_entity_t *entities, unsigned int max_entities ) +{ + ; +} + +static const byte *R_GetTextureOriginalBuffer( unsigned int idx ) +{ + return NULL; +} + +static int GL_LoadTextureFromBuffer( const char *name, rgbdata_t *pic, texFlags_t flags, qboolean update ) +{ + return 0; +} + +static void GL_ProcessTexture( int texnum, float gamma, int topColor, int bottomColor ) +{ + ; +} + +static void R_SetupSky( const char *skyname ) +{ + ; +} + +static void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty ) +{ + ; +} + +static void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, int texnum ) +{ + ; +} + +static void R_DrawTileClear( int texnum, int x, int y, int w, int h ) +{ + ; +} + +static void FillRGBA( float x, float y, float w, float h, int r, int g, int b, int a ) +{ + ; +} + +static int WorldToScreen( const vec3_t world, vec3_t screen ) +{ + VectorClear( screen ); + return 0; +} + +static qboolean VID_ScreenShot( const char *filename, int shot_type ) +{ + return false; +} + +static qboolean VID_CubemapShot( const char *base, uint size, const float *vieworg, qboolean skyshot ) +{ + return false; +} + +static colorVec R_LightPoint( const float *p ) +{ + colorVec c = { 0 }; + return c; +} + +static void R_DecalShoot( int textureIndex, int entityIndex, int modelIndex, vec3_t pos, int flags, float scale ) +{ + ; +} + +static int R_CreateDecalList( struct decallist_s *pList ) +{ + return 0; +} + +static float R_StudioEstimateFrame( cl_entity_t *e, mstudioseqdesc_t *pseqdesc, double time ) +{ + return 0.0f; +} + +static void R_StudioLerpMovement( cl_entity_t *e, double time, vec3_t origin, vec3_t angles ) +{ + ; +} + +static void R_InitSkyClouds( struct mip_s *mt, struct texture_s *tx, qboolean custom_palette ) +{ + ; +} + +static void GL_SubdivideSurface( model_t *mod, msurface_t *fa ) +{ + ; +} + +static void R_GetSpriteParms( int *frameWidth, int *frameHeight, int *numFrames, int currentFrame, const model_t *pSprite ) +{ + *frameWidth = *frameHeight = *numFrames = 0; +} + +static int R_GetSpriteTexture( const model_t *m_pSpriteModel, int frame ) +{ + return 0; +} + +static void Mod_LoadMapSprite( struct model_s *mod, const void *buffer, size_t size, qboolean *loaded ) +{ + *loaded = false; + return; +} + +static qboolean Mod_ProcessRenderData( model_t *mod, qboolean create, const byte *buffer ) +{ + return false; +} + +static void Mod_StudioLoadTextures( model_t *mod, void *data ) +{ + ; +} + +static void CL_DrawParticles( double frametime, particle_t *particles, float partsize ) +{ + ; +} + +static void CL_DrawTracers( double frametime, particle_t *tracers ) +{ + ; +} + +static void CL_DrawBeams( int fTrans, BEAM *beams ) +{ + ; +} + +static qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly ) +{ + return false; +} + +static int RefGetParm( int parm, int arg ) +{ + return 0; +} + +static void GetDetailScaleForTexture( int texture, float *xScale, float *yScale ) +{ + *xScale = *yScale = 1.0f; +} + +static void GetExtraParmsForTexture( int texture, byte *red, byte *green, byte *blue, byte *alpha ) +{ + *red = *green = *blue = *alpha = 0; +} + +static float GetFrameTime( void ) +{ + return 0.0f; +} + +static void R_SetCurrentEntity( struct cl_entity_s *ent ) +{ + ; +} + +static void R_SetCurrentModel( struct model_s *mod ) +{ + ; +} + +static int GL_FindTexture( const char *name ) +{ + return 0; +} + +static const char *GL_TextureName( unsigned int texnum ) +{ + return NULL; +} + +static const byte *GL_TextureData( unsigned int texnum ) +{ + return NULL; +} + +static int GL_LoadTexture( const char *name, const byte *buf, size_t size, int flags ) +{ + return 0; +} + +static int GL_CreateTexture( const char *name, int width, int height, const void *buffer, texFlags_t flags ) +{ + return 0; +} + +static int GL_LoadTextureArray( const char **names, int flags ) +{ + return 0; +} + +static int GL_CreateTextureArray( const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags ) +{ + return 0; +} + +static void DrawSingleDecal( struct decal_s *pDecal, struct msurface_s *fa ) +{ + ; +} + +static float *R_DecalSetupVerts( struct decal_s *pDecal, struct msurface_s *surf, int texture, int *outCount ) +{ + return NULL; +} + +static void R_EntityRemoveDecals( struct model_s *mod ) +{ + ; +} + +static void AVI_UploadRawFrame( int texture, int cols, int rows, int width, int height, const byte *data ) +{ + ; +} + +static void GL_Bind( int tmu, unsigned int texnum ) +{ + ; +} + +static void GL_LoadTextureMatrix( const float *glmatrix ) +{ + ; +} + +static void GL_TexGen( unsigned int coord, unsigned int mode ) +{ + ; +} + +static void GL_UpdateTexSize( int texnum, int width, int height, int depth ) +{ + ; +} + +static void GL_DrawParticles( const struct ref_viewpass_s *rvp, qboolean trans_pass, float frametime ) +{ + ; +} + +static colorVec LightVec( const float *start, const float *end, float *lightspot, float *lightvec ) +{ + colorVec c = { 0 }; + return c; +} + +static struct mstudiotex_s *StudioGetTexture( struct cl_entity_s *e ) +{ + return NULL; +} + +static void GL_RenderFrame( const struct ref_viewpass_s *rvp ) +{ + ; +} + +static void GL_OrthoBounds( const float *mins, const float *maxs ) +{ + ; +} + +static qboolean R_SpeedsMessage( char *out, size_t size ) +{ + return false; +} + +static byte *Mod_GetCurrentVis( void ) +{ + return NULL; +} + +static void *R_GetProcAddress( const char *name ) +{ + return NULL; +} + +static void Color4f( float r, float g, float b, float a ) +{ + ; +} + +static void Color4ub( unsigned char r, unsigned char g, unsigned char b, unsigned char a ) +{ + ; +} + +static void TexCoord2f( float u, float v ) +{ + ; +} + +static void Vertex3fv( const float *worldPnt ) +{ + ; +} + +static void Vertex3f( float x, float y, float z ) +{ + ; +} + +static void Fog( float flFogColor[3], float flStart, float flEnd, int bOn ) +{ + ; +} + +static void ScreenToWorld( const float *screen, float *world ) +{ + ; +} + +static void GetMatrix( const int pname, float *matrix ) +{ + ; +} + +static void FogParams( float flDensity, int iFogSkybox ) +{ + ; +} + +static void CullFace( TRICULLSTYLE mode ) +{ + ; +} + +static void VGUI_SetupDrawing( int *pColor ) +{ + ; +} + +static void VGUI_EnableTexture( qboolean enable ) +{ + ; +} + +static void VGUI_CreateTexture( int id, int width, int height ) +{ + ; +} + +static void VGUI_UploadTexture( int id, const char *buffer, int width, int height ) +{ + ; +} + +static void VGUI_UploadTextureBlock( int id, int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight ) +{ + ; +} + +static void VGUI_DrawQuad( const vpoint_t *ul, const vpoint_t *lr ) +{ + ; +} + +static void VGUI_GetTextureSizes( int *width, int *height ) +{ + *width = *height = 0; +} + +static int VGUI_GenerateTexture( void ) +{ + return 0; +} + +static ref_interface_t gReffuncs = +{ + .R_Init = R_Init, + .R_Shutdown = R_SimpleStub, + .R_GetConfigName = R_GetConfigName, + .R_SetDisplayTransform = R_SetDisplayTransform, + + .GL_SetupAttributes = GL_SetupAttributes, + .GL_InitExtensions = R_SimpleStub, + .GL_ClearExtensions = R_SimpleStub, + + .R_GammaChanged = R_SimpleStubBool, + .R_BeginFrame = R_SimpleStubBool, + .R_RenderScene = R_SimpleStub, + .R_EndFrame = R_SimpleStub, + .R_PushScene = R_SimpleStub, + .R_PopScene = R_SimpleStub, + .GL_BackendStartFrame = R_SimpleStub, + .GL_BackendEndFrame = R_SimpleStub, + + .R_ClearScreen = R_SimpleStub, + .R_AllowFog = R_SimpleStubBool, + .GL_SetRenderMode = R_SimpleStubInt, + + .R_AddEntity = R_AddEntity, + .CL_AddCustomBeam = CL_AddCustomBeam, + .R_ProcessEntData = R_ProcessEntData, + .R_Flush = R_SimpleStubUInt, + + .R_ShowTextures = R_SimpleStub, + + .R_GetTextureOriginalBuffer = R_GetTextureOriginalBuffer, + .GL_LoadTextureFromBuffer = GL_LoadTextureFromBuffer, + .GL_ProcessTexture = GL_ProcessTexture, + .R_SetupSky = R_SetupSky, + + .R_Set2DMode = R_SimpleStubBool, + .R_DrawStretchRaw = R_DrawStretchRaw, + .R_DrawStretchPic = R_DrawStretchPic, + .R_DrawTileClear = R_DrawTileClear, + .FillRGBA = FillRGBA, + .FillRGBABlend = FillRGBA, + .WorldToScreen = WorldToScreen, + + .VID_ScreenShot = VID_ScreenShot, + .VID_CubemapShot = VID_CubemapShot, + + .R_LightPoint = R_LightPoint, + + .R_DecalShoot = R_DecalShoot, + .R_DecalRemoveAll = R_SimpleStubInt, + .R_CreateDecalList = R_CreateDecalList, + .R_ClearAllDecals = R_SimpleStub, + + .R_StudioEstimateFrame = R_StudioEstimateFrame, + .R_StudioLerpMovement = R_StudioLerpMovement, + .CL_InitStudioAPI = R_SimpleStub, + + .R_InitSkyClouds = R_InitSkyClouds, + .GL_SubdivideSurface = GL_SubdivideSurface, + .CL_RunLightStyles = R_SimpleStub, + + .R_GetSpriteParms = R_GetSpriteParms, + .R_GetSpriteTexture = R_GetSpriteTexture, + + .Mod_LoadMapSprite = Mod_LoadMapSprite, + .Mod_ProcessRenderData = Mod_ProcessRenderData, + .Mod_StudioLoadTextures = Mod_StudioLoadTextures, + + .CL_DrawParticles = CL_DrawParticles, + .CL_DrawTracers = CL_DrawTracers, + .CL_DrawBeams = CL_DrawBeams, + .R_BeamCull = R_BeamCull, + + .RefGetParm = RefGetParm, + .GetDetailScaleForTexture = GetDetailScaleForTexture, + .GetExtraParmsForTexture = GetExtraParmsForTexture, + .GetFrameTime = GetFrameTime, + + .R_SetCurrentEntity = R_SetCurrentEntity, + .R_SetCurrentModel = R_SetCurrentModel, + + .GL_FindTexture = GL_FindTexture, + .GL_TextureName = GL_TextureName, + .GL_TextureData = GL_TextureData, + .GL_LoadTexture = GL_LoadTexture, + .GL_CreateTexture = GL_CreateTexture, + .GL_LoadTextureArray = GL_LoadTextureArray, + .GL_CreateTextureArray = GL_CreateTextureArray, + .GL_FreeTexture = R_SimpleStubUInt, + + .DrawSingleDecal = DrawSingleDecal, + .R_DecalSetupVerts = R_DecalSetupVerts, + .R_EntityRemoveDecals = R_EntityRemoveDecals, + + .AVI_UploadRawFrame = AVI_UploadRawFrame, + + .GL_Bind = GL_Bind, + .GL_SelectTexture = R_SimpleStubInt, + .GL_LoadTextureMatrix = GL_LoadTextureMatrix, + .GL_TexMatrixIdentity = R_SimpleStub, + .GL_CleanUpTextureUnits = R_SimpleStubInt, + .GL_TexGen = GL_TexGen, + .GL_TextureTarget = R_SimpleStubUInt, + .GL_TexCoordArrayMode = R_SimpleStubUInt, + .GL_UpdateTexSize = GL_UpdateTexSize, + .GL_Reserved0 = NULL, + .GL_Reserved1 = NULL, + + .GL_DrawParticles = GL_DrawParticles, + .LightVec = LightVec, + .StudioGetTexture = StudioGetTexture, + + .GL_RenderFrame = GL_RenderFrame, + .GL_OrthoBounds = GL_OrthoBounds, + .R_SpeedsMessage = R_SpeedsMessage, + .Mod_GetCurrentVis = Mod_GetCurrentVis, + .R_NewMap = R_SimpleStub, + .R_ClearScene = R_SimpleStub, + .R_GetProcAddress = R_GetProcAddress, + + .TriRenderMode = R_SimpleStubInt, + .Begin = R_SimpleStubInt, + .End = R_SimpleStub, + .Color4f = Color4f, + .Color4ub = Color4ub, + .TexCoord2f = TexCoord2f, + .Vertex3fv = Vertex3fv, + .Vertex3f = Vertex3f, + .Fog = Fog, + .ScreenToWorld = ScreenToWorld, + .GetMatrix = GetMatrix, + .FogParams = FogParams, + .CullFace = CullFace, + + .VGUI_DrawInit = R_SimpleStub, + .VGUI_DrawShutdown = R_SimpleStub, + .VGUI_SetupDrawingText = VGUI_SetupDrawing, + .VGUI_SetupDrawingRect = VGUI_SetupDrawing, + .VGUI_SetupDrawingImage = VGUI_SetupDrawing, + .VGUI_BindTexture = R_SimpleStubInt, + .VGUI_EnableTexture = VGUI_EnableTexture, + .VGUI_CreateTexture = VGUI_CreateTexture, + .VGUI_UploadTexture = VGUI_UploadTexture, + .VGUI_UploadTextureBlock = VGUI_UploadTextureBlock, + .VGUI_DrawQuad = VGUI_DrawQuad, + .VGUI_GetTextureSizes = VGUI_GetTextureSizes, + .VGUI_GenerateTexture = VGUI_GenerateTexture, +}; + +int EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, ref_globals_t *globals ); +int EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, ref_globals_t *globals ) +{ + if( version != REF_API_VERSION ) + return 0; + + // fill in our callbacks + memcpy( funcs, &gReffuncs, sizeof( ref_interface_t )); + memcpy( &gEngfuncs, engfuncs, sizeof( ref_api_t )); + gpGlobals = globals; + + return REF_API_VERSION; +} diff --git a/ref/null/wscript b/ref/null/wscript new file mode 100644 index 00000000..3a6ec152 --- /dev/null +++ b/ref/null/wscript @@ -0,0 +1,20 @@ +#! /usr/bin/env python +# encoding: utf-8 +# mittorn, 2018 + +def options(opt): + pass + +def configure(conf): + pass + +def build(bld): + bld.shlib( + source = 'r_context.c', + target = 'ref_null', + features = 'c', + defines = 'REF_DLL', + use = 'engine_includes sdk_includes werror', + install_path = bld.env.LIBDIR, + subsystem = bld.env.MSVC_SUBSYSTEM + ) diff --git a/wscript b/wscript index 219bc45b..c0315044 100644 --- a/wscript +++ b/wscript @@ -75,6 +75,7 @@ SUBDIRS = [ Subproject('3rdparty/gl4es', lambda x: not x.env.DEDICATED and x.env.GL4ES), Subproject('ref/gl', lambda x: not x.env.DEDICATED and (x.env.GL or x.env.NANOGL or x.env.GLWES or x.env.GL4ES)), Subproject('ref/soft', lambda x: not x.env.DEDICATED and not x.env.SUPPORT_BSP2_FORMAT and x.env.SOFT), + Subproject('ref/null', lambda x: not x.env.DEDICATED and x.env.NULL), Subproject('3rdparty/mainui', lambda x: not x.env.DEDICATED), Subproject('3rdparty/vgui_support', lambda x: not x.env.DEDICATED), Subproject('stub/client', lambda x: not x.env.DEDICATED), @@ -100,6 +101,7 @@ REFDLLS = [ RefDll('gles2', False, 'GLWES'), RefDll('gl4es', False), RefDll('gles3compat', False), + RefDll('null', False), ] def options(opt):